【问题标题】:Relational operator in C while using real variables [duplicate]C中的关系运算符同时使用实变量[重复]
【发布时间】:2017-09-09 08:26:42
【问题描述】:

为什么输出不符合预期?

#include <stdio.h>
void main(){
    float a,b,c;
    b=0.7;
    if( b<0.7 )
        printf(" It should NOT be here");
    else
        printf("It Should be here");
}

【问题讨论】:

  • 请正确格式化您的代码并给出预期的输出,以及您得到的输出。

标签: c floating-point relational


【解决方案1】:

0.7 是双值。在代码中尝试 0.7f。它应该可以工作。

【讨论】:

  • 不,看来您不了解浮点行为。是 0.69999999999999996 还是 0.699999988 取决于声明
  • b 是一个浮点数; 0.7 是 double 类型的值。两者的比较需要换算。编译器会将浮点值转换为双精度值......并且将浮点数转换为双精度值的值与编译器将文本字符串(源代码)转换为双精度值的值不同。但永远不要将浮点值(float、double 或 long double)与 == 进行比较。
  • @JacekCz - 我用 0.7f 尝试了这段代码,它可以工作。请自行尝试。它应该可以工作。
  • @RudyVelthuis 但类型应该相同。浮点数应与浮点数进行比较。
  • @Jaczek:如果转换正确,b中的值应该等于0.7fb = 0.7f; if (b &lt; 0.7f)
【解决方案2】:

浮点数

所以行为你很惊讶

【讨论】:

  • FWIW,0.7 (double) 正好是 0.6999999999999999555910790149937383830547332763671875,而 0.7f (float) 正好是 0.699999988079071044921875。所以浮点数略小于0.7double 表示。
【解决方案3】:

请尝试下面的代码,它可以工作!!!:

代码

 #include <stdio.h>

    int  main(void)
    {

    float a,b,c,temp;
    temp=0.7;
    b=0.7;

    if( b<temp )
        printf(" It should NOT be here");
    else
        printf("It Should be here");


    }

【讨论】:

  • 你试过了吗?应该不会
  • 它有效!我已经运行了它
  • 严重吗?在哪个平台上?
  • 更改初始化分配不会改变任何事情。这是一个依赖于平台的结果,与浮点的工作方式有关。你只是给了 OP 他们自己的代码并说“试试看”。
  • @StoryTeller 不是“他们自己的代码”。与问题中的代码不同,此答案中的代码对于将 FLT_EVAL_METHOD 正确定义为零的任何编译器打印 It Should be here,但有趣的是,对于正确将 FLT_EVAL_METHOD 定义为 2 的编译器,它不必如此。
猜你喜欢
  • 2021-11-08
  • 2018-08-22
  • 2018-05-30
  • 2010-10-19
  • 2021-04-26
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多