为什么在下面的代码中不是== 0?
#include <stdio.h>
int main()
{
float a=1.0;
long i;
for(i=0; i<100; i++)
{
a = a - 0.01;
}
printf("%e\n",a);
}
结果是:6.59e-07为什么在下面的代码中不是== 0?
这是一个二进制浮点数字,而不是一个小数一个 - 因此你需要期待舍入误差。看到基本部本文中:
What Every Programmer Should Know About Floating-Point Arithmetic
例如,值0.01不具有二进制浮点型精确represenation。为了得到一个“正确”的结果你的样品中,你将不得不圆形或使用AA十进制浮点类型(见Wikipedia):
二进制定点类型是最常用的,因为缩放操作可能是实现为快速位移。二进制定点数可以精确地表示两个分数幂,但是像二进制浮点数一样,不能精确地表示十的分数幂。如果需要十的确切分数幂,则应使用十进制格式。例如,十进制(0.1)和百分之一(0.01)只能用二进制定点或二进制浮点表示近似表示,而它们可以精确地用十进制定点或十进制浮点表示表示。这些表示可以用许多方式进行编码,包括BCD。
另请注意,0.01不是2的幂,因此浮点数将嵌入在那里,因此浮点数将包含垃圾,这会形成您看到的其余错误。不确定,但0.125,8次可能会产生一个干净的循环? – 2011-04-28 15:23:25
这里有两个问题。如果您问,为什么我的printf语句将结果显示为6.59e-07
而不是0.000000659
,这是因为您已将format specifier用于科学记数法:%e
。你需要%f
为浮点数a
。
printf("%f\n",a);
如果你问为什么结果不完全为零,而不是0.000000659
,答案是(正如其他人所指出的),就采用二进制数浮点运算需要期待四舍五入。
感谢您的时间.....我的问题是关于结果不完全是零....感谢您的回答.. – user1754940 2011-04-28 10:00:22
@ user692209在问题的意见,你说你的问题是关于科学符号,而不是价值。 :) – razlebe 2011-04-28 10:09:29
这是现场浮点数舍入错误。每次减去一个分数时,您都可以近似得到您通常从纸上的数字中得到的结果,因此最终结果非常接近零,但不一定精确为零。
您必须指定%f来打印浮点数然后它将为变量a打印0。
经过测试。结果是0.000001 – 2011-04-28 09:44:10
@Captain:%f将显示精度为6.这就是为什么你得到的结果为0.000001。 – karthik 2011-04-28 09:46:12
感谢您的时间给Captain和karthik – user1754940 2011-04-28 10:03:06
浮点数的精度不准确,这就是为什么你找到这个结果。
Cordially
'6.59e-07'为'0.000000659'。这非常接近'0'。足够接近'浮动'精度。 – pmg 2011-04-28 09:39:14
你问你为什么结果是近似为零;或者你问你为什么看到以科学记数法显示的结果? – razlebe 2011-04-28 09:46:21
感谢你的时间......我的问题是为什么“a”以科学记数法显示? – user1754940 2011-04-28 09:55:31