浮点数和双变量的比较

时间:2010-10-21 14:55:25

标签: c comparison floating-point double

  

可能重复:
  Difference between float and double
  strange output in comparision of float with float literal

我正在使用visual C ++ 6.0,在程序中我正在比较float和double变量 例如,这个程序

#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作为输出

#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 0 0。

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

4 个答案:

答案 0 :(得分:8)

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

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

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 :(得分:2)

1.7d和1.7f非常可能是不同的值:一个是在双重表示中最接近绝对值1.7的一个,并且一个是在浮点表示中最接近绝对值1.7的值

要将其简化为易于理解的术语,请假设您有两种类型shortDecimallongDecimalshortDecimal是十进制值,带有3位有效数字。 longDecimal是十进制值,带有5位有效数字。现在假设你有一些在程序中表示pi的方法,并将值赋给shortDecimallongDecimal变量。短值为3.14,长值为3.1416。这两个值并不相同,即使它们在各自类型中都是与pi最接近的可表示值。

答案 2 :(得分:1)

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

因此,1.7和1.7f不同。

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

但是在十进制中,将1.7乘以2再次:你将只获得非整数(小数部分将在.4.8.6和{{1}之间循环})。因此,1.7不是2的幂的总和。

答案 3 :(得分:0)

您无法比较浮点变量的相等性。原因是小数部分表示为二进制分数,这意味着精度损失。