2012-02-27 59 views
1

请解释为什么以下代码段的行为有所不同。解释此浮点行为

#include<stdio.h> 
int main(){ 
float a=0.1; 
if(a<0.1) 
    printf("less"); 
else 
    printf("greater than equal"); 
getchar(); 
} 

Output:greater than equal

#include<stdio.h> 
int main(){ 
float a=0.7; 
if(a<0.7) 
    printf("less"); 
else 
    printf("greater than equal"); 
getchar(); 
} 

Output:less出乎我的预期。

PS:这不是作业。

+1

下次搜索本网站。这已被询问了1000多次。 – leppie 2012-02-27 08:06:37

+0

请解释为什么反对投票? – Bazooka 2012-02-27 08:07:10

+0

您未能搜索此网站,这就是为什么。 – leppie 2012-02-27 08:07:46

回答

4

您不能在浮点数上可靠地使用比较运算符。

比较两个浮点数的一个好方法是具有一个精度阈值,该精度阈值相对于被比较的两个浮点数的大小。

喜欢的东西:

#include <math.h> 
if(fabs(a - b) <= accurary_threshold * fabs(a)) 

良好阅读:

+0

谢谢,我不知道这件事。 – Bazooka 2012-02-27 08:11:26

+0

@Parminder:现在你就是这么做的,就是这样学习,犯错误,但从错误中学习,不要重复。 :) – 2012-02-27 08:12:42

+0

尝试学习是我做的。 :) – Bazooka 2012-02-27 08:15:53

2

浮点数不准确。具体而言,您的号码不一定与浮动数据进行比较。如果您使用'0.7f'而不是'0.7'(至少在我的编译器上),那么相同的代码将与您的预期相符,但您应该通常与阈值进行比较,如前面的答案所述。

10

这里涉及两种不同的类型:floatdouble。你是分配float,但然后比较double

试想floatdouble实际上2和4位小数浮点类型代替。现在想象一下你有:

float a = 0.567123 // Actually assigns 0.57 
if (a < 0.567123) // Actually compares 0.5700 with 0.5671 
{ 
    // We won't get in here 
} 

float a = 0.123412; // Actually assigns 0.12 
if (a < 0.123412) // Actually compares 0.1200 with 0.1234 
{ 
    // We will get in here 
} 

显然这是近似发生了什么,但它解释了两种不同的结果。

这很难说,你应该没有更多的信息可以做什么 - 很可能是你不应该使用floatdouble可言,或者你应该用宽容的一些水平比较,或者你应该在任何地方都使用double,否则您应该接受某种程度的“不准确”,这只是系统工作的一部分。

0

当您执行比较时,您正在比较float(24位精度)和double(53位精度)。您的浮点值是通过从更精确的double值四舍五入来创建的。有时它会缩小,有时会变成圆形。它几乎不会是相同的。

再次尝试您的例子,但测试所有三个可能的结果:等于,少,和更大。

再次尝试使用a作为示例。

再次尝试您的示例并与浮点数进行比较。

2
#include<stdio.h> 

int main() { 
    float a = 0.7; 
    if (a < 0.7) 
     printf("less"); 
    else 
     printf("greater than equal"); 
    getchar(); 
} 

无后缀浮动常数doublefloat类型。例如,0.7double类型的浮点常量。

if (a < 0.7) 

如在比较表达式右操作数是double类型的,正常的算术转换应用和a值被提升到doubledoublefloat不具有相同的精度。为了得到正确的结果,你应该使用float类型的浮点常量。

if (a < 0.7f) 

0.7ffloat类型的浮动恒定。