【发布时间】:2014-06-08 20:32:27
【问题描述】:
使用 gcc 4.8.2 (Ubuntu 14.04) 我得到不同的结果,而基本上以相同的方式计算值。根据我测试的系统上的架构(32 位/64 位),也存在差异。
#include <math.h>
#include <stdio.h>
int main()
{
float h = 0.11f;
float y = 0.11f;
float g = 1.37906f;
float x = 2.916949f;
float result1 = (h * y / fabs(g)) / x;
float result2 = h * y / fabs(g);
result2 /= x;
float result3 = (h * y / g) / x;
printf("%.20f \n", result1); //0.00300796888768672943
printf("%.20f \n", result2); //0.00300796912051737309
printf("%.20f \n", result3); //0.00300796912051737309 on x64
//0.00300796888768672943 on x32
}
这是什么原因,我该如何预测或避免这些差异?
编辑:铸造晶圆厂浮动不会改变结果,至少在我的系统上(参见 Oli Charlesworth 的 cmets)。
【问题讨论】:
-
要求从单精度(23 位)浮点数输出 20 位数字几乎没有意义。
-
是的,它对精度没有意义,但它显示了差异。请注意,要准确表示浮点数位的值,您可能需要 20 位以上的数字。
-
@Leushenko 任何有限的单精度浮点数精确地表示某个数字,并且有很多理由希望看到该数字的精确十进制表示(这通常意味着打印超过 20十进制数字)。
标签: c gcc floating-point gcc4.8