为什么在下面的代码中不是== 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?

+7

'6.59e-07'为'0.000000659'。这非常接近'0'。足够接近'浮动'精度。 – pmg 2011-04-28 09:39:14

+0

你问你为什么结果是近似为零;或者你问你为什么看到以科学记数法显示的结果? – razlebe 2011-04-28 09:46:21

+0

感谢你的时间......我的问题是为什么“a”以科学记数法显示? – user1754940 2011-04-28 09:55:31

这是一个二进制浮点数字,而不是一个小数一个 - 因此你需要期待舍入误差。看到基本部本文中:

What Every Programmer Should Know About Floating-Point Arithmetic

例如,值0.01不具有二进制浮点型精确represenation。为了得到一个“正确”的结果你的样品中,你将不得不圆形或使用AA十进制浮点类型(见Wikipedia):

二进制定点类型是最常用的,因为缩放操作可能是实现为快速位移。二进制定点数可以精确地表示两个分数幂,但是像二进制浮点数一样,不能精确地表示十的分数幂。如果需要十的确切分数幂,则应使用十进制格式。例如,十进制(0.1)和百分之一(0.01)只能用二进制定点或二进制浮点表示近似表示,而它们可以精确地用十进制定点或十进制浮点表示表示。这些表示可以用许多方式进行编码,包括BCD。

+0

另请注意,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,答案是(正如其他人所指出的),就采用二进制数浮点运算需要期待四舍五入。

+0

感谢您的时间.....我的问题是关于结果不完全是零....感谢您的回答.. – user1754940 2011-04-28 10:00:22

+0

@ user692209在问题的意见,你说你的问题是关于科学符号,而不是价值。 :) – razlebe 2011-04-28 10:09:29

这是现场浮点数舍入错误。每次减去一个分数时,您都可以近似得到您通常从纸上的数字中得到的结果,因此最终结果非常接近零,但不一定精确为零。

您必须指定%f来打印浮点数然后它将为变量a打印0。

+0

经过测试。结果是0.000001 – 2011-04-28 09:44:10

+1

@Captain:%f将显示精度为6.这就是为什么你得到的结果为0.000001。 – karthik 2011-04-28 09:46:12

+0

感谢您的时间给Captain和karthik – user1754940 2011-04-28 10:03:06

浮点数的精度不准确,这就是为什么你找到这个结果。

Cordially