浮点数和双变量的比较

可能重复:
float和double之间的区别
float与float文字的比较中的奇怪输出

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

#include int main() { float a = 0.7f; double b = 0.7; printf("%d %d %d",ab,a==b); return 0; } 

我得到1 0 0作为输出

并为

 #include int main() { float a = 1.7f; double b = 1.7; printf("%d %d %d",ab,a==b); return 0; } 

我输出0 0 0。

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

它与浮动和双重内部表示在计算机中的方式有​​关。 计算机以二进制forms存储基数为2的基数。以二进制forms存储的基数为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不同。

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

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

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