可能重复:
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中的两个变量?
答案 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的值
要将其简化为易于理解的术语,请假设您有两种类型shortDecimal
和longDecimal
。 shortDecimal
是十进制值,带有3位有效数字。 longDecimal
是十进制值,带有5位有效数字。现在假设你有一些在程序中表示pi的方法,并将值赋给shortDecimal
和longDecimal
变量。短值为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)
您无法比较浮点变量的相等性。原因是小数部分表示为二进制分数,这意味着精度损失。