【问题标题】:Comparing float values in if condition is not working in C [duplicate]如果条件在C中不起作用,比较浮点值[重复]
【发布时间】:2021-09-19 16:28:36
【问题描述】:
int main() {
// Write C code here
float x = 3.14;
if(x==3.14){
    printf("true");
}

return 0;

}

我无法执行这部分 if 条件。

【问题讨论】:

  • 3.14 是双精度,试试if (x == 3.14f)
  • 作为一般规则,不要尝试比较浮点数是否完全相等。浮点数几乎从来都不是精确的。即使看起来它们必须相等(例如,当您测试一个值是否是您认为的那样),也有许多事情可以“在幕后”进行以使相等比较失败。这就是这里发生的事情。
  • 对于float x = 3.14; MS VC 确实发出警告:truncation from 'double' to 'float'。如果您的编译器没有这样做,请提高警告级别。如果是这样,请不要忽略警告 - 有些肯定是错误。

标签: c if-statement floating-point


【解决方案1】:

不要写x = 3.14;,而是写x = 3.14f,而不是if(x == 3.14),而是写if(x == 3.14f),因为3.14是一个double,3.14f是一个float。

【讨论】:

  • 你是对的,但x == 3.14f 可能仍然返回 false。
  • @LucaPolito: x == 3.14f 将评估为真。
  • @EricPostpischil 这取决于:在这种情况下是的,但如果 float x = 3.04f + 0.1f;x == 3.14f 可能会返回 false。检查x是否为3.14f不是一个好方法。
  • @LucaPolito:这是一个不同的问题。我曾多次写过floating-point comparison:将比较单独作为一个问题是错误的。给定一些产生结果xy 的浮点计算,问题不在于您无法比较xy,而是xy 不是您想要的数字。理想情况下,您将使用实数算术计算一些数字 xy。但你没有。然后你的问题不是你不能比较它们,而是你没有你想要的数字……
  • ... 您没有想要的数字这一事实不仅意味着您“无法”比较它们,而且您不知道有什么区别,您不知道正确的值是什么,您不知道使用xy 作为测量值而不是xy 制造的机器是否可以工作,您不知道是否将xy 将给出乘以 xy 的期望结果,依此类推。从根本上说,问题在于早期的计算产生了舍入误差。将所有这些都放在比较操作上是错误的……
【解决方案2】:

3.14 是一个double 常量。

float x = 3.14;3.14 转换为float

x==3.14x 中的floatdouble 3.14 进行比较。它们不相等。

doublefloat 格式使用不同的数字表示,不能表示所有相同的值。 (float 数字是 double 数字的子集。)

x == 3.14f 会将x 中的floatfloat 常量3.14f 进行比较。

最好将float 常量与float 类型一起使用,因此将x 初始化为float x = 3.14f; 而不是float x = 3.14;

【讨论】:

    【解决方案3】:

    将它包裹在浮点数中:if(x==float(3.14))

    编辑:意识到它在 c 中。为什么不强制转换(浮动)3.14?

    【讨论】:

    • 恐怕你的答案不是C。
    • 请注意,您可以edit您的问题来解决它。
    • 现在答案没问题...
    • 用正确的答案覆盖错误的答案似乎比保留错误的答案并事后更正更合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2020-08-07
    • 1970-01-01
    • 2013-07-02
    • 2011-10-24
    相关资源
    最近更新 更多