我编写了以下代码,以比较C中的float变量和double变量。
int main()
{
float f = 1.1;
double d = 1.1;
if(f==d)
printf("EQUAL");
if(f < d)
printf("LESS");
if(f > d)
printf("GREATER");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用在线C编译器来编译我的代码。
我知道,绝不会为重复的小数点打印EQUAL。但是,我期望应该打印的是LESS,因为double应该具有更高的精度,因此应该比float更接近1.1的实际值。据我所知,在C中,当您比较float和double时,float的尾数会零扩展为double,并且零扩展的值应始终较小。
而是在所有情况下都打印GREATER。我在这里想念什么吗?
如果在声明 2 个变量后添加以下 2 行:
printf("%.9g\n", f);
printf("%.17g\n", d);
Run Code Online (Sandbox Code Playgroud)
您将获得以下输出:
1.10000002
1.1000000000000001
Run Code Online (Sandbox Code Playgroud)
所以很容易地看到,由于精度的float是大于所述double的这样的打印GREATER是好的。
最接近1.1的浮点数的精确值是1.10000002384185791015625。二进制等效值为1.00011001100110011001101
最接近于1.1的double的精确值是1.100000000000000088817841970070023223233890533447265625。二进制等效项为1.0001100110011001100110011001100110011001100110011010。
将两个二进制数字彼此相邻排列:
1.00011001100110011001101
1.0001100110011001100110011001100110011001100110011010
Run Code Online (Sandbox Code Playgroud)
舍入为浮点数的前几个截断位是11001100,它大于一半,因此对浮点数的转换被四舍五入,使其最低有效位为11001101。舍入导致最高浮点数的差值为1在double中为0的位置。浮点数大于双精度数,而不管低有效位的值在扩展为双精度的浮点数中为零,还是在双精度数中非零。