【问题标题】:Why these two programs of same type giving different Outputs? [duplicate]为什么这两个相同类型的程序给出不同的输出? [复制]
【发布时间】:2018-04-01 11:49:18
【问题描述】:

第一个项目

#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 的任何值提供相同的输出。代码中发生了什么?

谁能帮助我理解它?

【问题讨论】:

  • afloat0.7double0.7f 将是 float
  • 另一个类似的话题(涵盖文字案例):*.com/questions/1839422/…
  • 实际上是 0.7d 而不是 0.7f 供参考打开这个 (geeksforgeeks.org/output-of-c-programs-set-65-if-else) link 并查看问题 5
  • 0.7d 无关紧要,因为它在与任何东西进行比较之前存储在float 中。这是后缀很重要的下一个。
  • 实际上,每个程序都会询问是否将给定的 double 舍入为 float 会降低其值。这取决于价值,所以没有理由期待相同的答案。最接近 0.7 的 double 是 0.6999999999999999555910790149937383830547332763671875,浮点转换 0.699999988079071044921875,这会降低值。最接近0.8的double是0.8000000000000000444089209850062616169452667236328125,浮点数转换0.800000011920928955078125,增加值。

标签: c floating-point output


【解决方案1】:

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

0.7的情况下,float表示小于double表示。

如果是 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 为她的评论生成的数字相同,但方式略有不同。)

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

【讨论】:

最近更新 更多