浮点和双变量的比较

可能重复:
浮动和双重之间的区别
在浮点数和浮点数之间进行比较的奇怪输出

我正在使用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 1 0。

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


它与计算机中浮动和双打的内部表示方式有关。 计算机以二进制格式存储数字,它是基数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.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的幂的和。

链接地址: http://www.djcxy.com/p/78613.html

上一篇: Comparison of float and double variables

下一篇: ATMEGA8A + SPI memory strange behavior