浮点和双变量的比较
可能重复:
浮动和双重之间的区别
在浮点数和浮点数之间进行比较的奇怪输出
我正在使用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在浮动表示。
为了将其应用于更简单易懂的术语,假设您有两种类型, shortDecimal
和longDecimal
。 shortDecimal
是一个有3位有效数字的小数值。 longDecimal
是一个有5位有效数字的小数值。 现在想象一下,在程序中有一些代表pi的方法,并将该值分配给shortDecimal
和longDecimal
变量。 短期价值为3.14,长期价值为3.1416。 这两个值是不一样的,即使它们都是pi在各自类型中最接近的可表示值。
1.7是十进制。 在二进制中,它具有非有限表示。
因此,1.7和1.7f有所不同。
启发式证明:当您向左移位(即乘以2)时,如果二进制表示为“有限”,它最终将是整数。
但是在十进制中,将1.7乘以2再乘以:只会得到非整数(小数部分将在.4
, .8
, .6
和.2
之间循环)。 所以1.7不是2的幂的和。