关于C#:float和double变量的比较

Comparison of float and double variables

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Difference between float and double
strange output in comparision of float with float literal

我使用Visual C++ 6,在一个程序中,我比较浮点和双变量。例如,对于这个程序

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()  
{    
    float a = 0.7f;
    double b = 0.7;
    printf("%d %d %d",a<b,a>b,a==b);
    return 0;
 }

我的输出是1 0 0

为了

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()  
{    
    float a = 1.7f;
    double b = 1.7;
    printf("%d %d %d",a<b,a>b,a==b);
    return 0;
 }

我得到0 1 0作为输出。

请告诉我为什么我得到这些奇怪的输出,有没有任何方法可以预测这些输出在同一个处理器上。另外,如何比较C中的两个变量?


它与计算机中浮点和双精度数的内部表示方式有关。计算机以2为基数的二进制存储数字。以二进制形式存储时,以10为基数的数字可能有重复的数字,并且计算机中存储的"精确"值不相同。

比较浮点数时,通常使用epsilon来表示值的微小变化。例如:

1
2
3
4
5
6
float epsilon = 0.000000001;
float a = 0.7;
double b = 0.7;

if (abs(a - b) < epsilon)
  // they are close enough to be equal.


1.7d和1.7f很可能是不同的值:一个是在双表示中最接近绝对值1.7,另一个是在浮点表示中最接近绝对值1.7。

为了更简单地理解术语,假设您有两种类型,shortDecimallongDecimalshortDecimal是一个具有3个有效数字的十进制值。longDecimal是一个具有5个有效数字的十进制值。现在假设您有某种方法来表示程序中的pi,并将值赋给shortDecimallongDecimal变量。短值为3.14,长值为3.1416。这两个值并不相同,尽管它们都是各自类型中最接近pi的可表示值。


1.7为十进制。在二进制中,它具有非有限表示。

因此,1.7和1.7f不同。

启发式证明:如果二进制表示是"有限的",那么当您将位向左移位(即乘以2)时,它最终将是一个整数。

但在十进制中,将1.7乘以2,然后再次:您将只获得非整数(十进制部分将在.4.8.6.2之间循环)。因此,1.7不是2的幂和。


不能比较浮点变量是否相等。原因是小数部分用二进制表示,这意味着精度降低。