为什么这两个相同类型的程序提供不同的输出?

时间:2018-04-01 11:49:18

标签: c floating-point output

第一个程序

#include"stdio.h" 
int main()
{
    float a=0.7d; 
    if(a<0.7)
         printf("C");
        else
         printf("C++");
    return 0;
}

此程序输出 C 在哪里作为第二个程序

#include"stdio.h" 
int main()
{
    float a=0.8d; 
    if(a<0.8)
         printf("C");
        else
         printf("C++");
    return 0;
}

输出 C ++

为什么会这样发生他们应该为a的任何值提供相同的输出。代码中发生了什么?

有人可以帮我理解吗?

1 个答案:

答案 0 :(得分:1)

这两个数字都不能用二进制表示。

在0.7的情况下,浮动表示小于双重表示。

在0.8的情况下,反之亦然,因为浮动是向上舍入的。

以下printf格式输出"%25.18f

 0.7 as double: 0.699999999999999956
 0.7 as float:  0.699999988079071045
 0.8 as double: 0.800000000000000044
 0.8 as float:  0.800000011920928955

(这些与@PatriciaShanahan以略微不同的方式为她的评论生成的数字相同。)

这类问题的常见解决方案是在比较浮点数时允许小容差。