Tag: 精度

C中的浮动和双精度

在C中,double比float更精确,根据“C primerplus第六版”一书(第80页),浮点数可以代表至少6个有效数字,双数字可以代表至少13个有效数字。 所以我尝试用这个简单的例子validation: #include int main(void){ float a = 3.3333333; // 7 significant digits double b = 3.33333333333333;// 14 significant digits printf(“\nFloat: %f\n”, a); printf(“Double: %f\n”, b); return 0; } 这是该计划的输出: Float : 3.333333 Double: 3.333333 为什么double值与float值具有相同的精度,而不是显示更多有效数字?

C浮点和双重比较

我在比较C中的简单浮点数和双精度数,特别是两者的值8.7。 现在我为每个变量分配8.7,当我打印时,我得到两个值的8.7000的结果。 为什么编译器添加了这些零。 我想问的主要问题是还有任何我没有看到的数字,如隐藏在尾随零之后的数字。 我读到由于缺乏精确度,我不应该使用float进行这样的比较,但是我认为它具有如此小的值,它确实可以存储8.7,并且需要一定程度的精确度来与另一个8.7值进行比较? 我唯一担心的是它实际上是在内存中的某个位置表示为例如8.70000003758或其他东西,这会让我的比较失败? 我试图使用%.20f打印f以查看可能隐藏的任何其他数字,但我认为只是创建了数字,否则不存在,因为数字的整体精确度变为8.6918734634834929或类似的东西。

在C中以更高的精度存储数字

我正在编写一个程序,其中我需要以非常高的精度(大约10^-10 )存储数字,然后进一步使用它们参数( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem) )。 我能得到的最高精度是double (大约10^-6 )这是不够的。 我们如何在c中存储更高精度的数字?

GMP上的精度损失mpf_add。 我的数字去了哪里?

我总结了两个负浮点数: char * lhs = “-2234.6016114467412141”; char * rhs = “-4939600281397002.2812”; 根据Perl,使用bignum和Math :: BigFloat,答案是 -4939600281399236.8828114467412141 但是,根据GMP,使用下面的代码,答案是 -4939600281399236.88281 我哪里出错了? 剩下的“14467412141”怎么了? #include “stdafx.h” #include “gmp-static\gmp.h” #include /* For _MAX_PATH definition */ #include #include #include #define F(x) mpf_t x; mpf_init( x ); void main(void) { F(f_lhs); F(f_rhs); F(f_res); char * resbuff; mp_exp_t exp; char * lhs = “-2234.6016114467412141”; […]

用整数除以double

我在将double与int分开时面临一个问题。 代码段是: double db = 10; int fac = 100; double res = db / fac; res的值是0.10000000000000001而不是0.10 。 有谁知道这是什么原因? 我正在使用cc来编译代码。

为什么 – GCC中的-freciprocal-math不安全?

GCC中的-freciprocal-math更改以下代码 double a = b / c; 至 double tmp = 1/c; double a = b * tmp; 在GCC手册中,据说这种优化是不安全的,并且不符合IEEE标准。 但我想不出一个例子。 你能举个例子吗?

C – 双精度求和

我有双格式精度的问题。 示例示例: double K=0, L=0, M=0; scanf(“%lf %lf %lf”, &K, &L, &M); if((K+L) <= M) printf("Incorrect input"); else printf("Right, K=%f, L=%f, M=%f", K, L, M); 我的测试输入: K = 0.1,L = 0.2,M = 0.3 – >条件但是转到‘else’语句。 我怎么能纠正这种差异? 还有其他方法可以求和吗?

用C语言解释32位无符号长单精度IEEE-754浮点数

我使用的是Microchip的XC32编译器,它基于标准的C编译器。 我正在从RS485网络上的设备读取32位值,并将其存储在unsigned long中,我将其命名为DWORD。 即 typedef DWORD unsigned long; 就目前而言,当我将此值转换为浮点值时,我得到的值基本上是它的整数表示的浮点版本,而不是正确的IEEE-754解释浮点数。 即 DWORD dword_value = readValueOnRS485(); float temp = (float)dword_value; 这里,dword_value会以hex格式表示为0x4366C0C4,作为十进制表示为1130807492,因此将其类型转换为float只会给我1.130807492 * 10 ^ 9或1130807492.0这不是我想要的。 我想要单精度IEEE-754表示,它给我一个浮点值230.75299072265625 所以显然,对浮动进行类型转换对我来说不起作用。 我需要一种可以转换此forms的方法。 我在XC32库中看了一遍,但找不到任何东西。 有没有人知道一个预定义的方法,为我正确地解释了这个? 或者可能有一些建议的方法我可以写? 我试图避免为这个特定任务编写自己的代码,因为我担心如果C已经有了这个function,我找不到有效的解决方案。 有趣的是,如果我对char *执行此操作,则该值在该char *上正确表示为230.75: sprintf(random_char_pointer, “%.2f, dword_value); 这里打印random_char_pointer到屏幕给我230.75所以sprintf必须正确处理解释。 因此我假设C中已经存在某些东西。 有人可以帮忙吗?

了解C中的双精度运算

我想了解为什么这段代码: double r,d,rc; scanf(“%lf %lf”, &r, &d); rc = (r * r) – (d/2) * (d/2); printf(“%.2f\n”, M_PI * rc); 返回比这个更精确的结果(没有rc变量赋值): double r,d,rc; scanf(“%lf %lf”, &r, &d); printf(“%.2f\n”, M_PI * (r * r) – (d/2) * (d/2)); 另一个相关的问题:为什么n * n比pow(n,2)更好?

为什么浮点数的有效数字是7或6

我在Wikipedia log 2 24 = 7.22中看到了这一点。 我不知道为什么我们应该计算2 ^ 24以及为什么我们应该使用log10 ……我真的需要你的帮助。