浮点数和双变量的比较
可能重复:
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的值。
要将其置于更简单易懂的术语中,假设您有两种类型, shortDecimal
和longDecimal
。 shortDecimal
是一个十进制值,含有3位有效数字。 longDecimal
是一个十进制值,含有5位有效数字。 现在假设你有一些在程序中表示pi的方法,并将值shortDecimal
和longDecimal
变量。 短值为3.14,长值为3.1416。 这两个值并不相同,即使它们在各自类型中都是与pi最接近的可表示值。
1.7是十进制。 在二进制中,它具有非有限表示。
因此,1.7和1.7f不同。
启发式certificate:当你向左移位(即乘以2)时,如果二进制表示是“有限的”,它最终将是一个整数。
但是在十进制中,将1.7乘以2再次:你将只获得非整数(小数部分将在.4
, .8
, .6
和.2
之间循环)。 因此1.7不是2的幂的总和。
您无法比较浮点变量的相等性。 原因是小数部分表示为二进制分数,这意味着精度损失。