【问题标题】:Why the usage of floating point numbers in switch doesn't worky?在 switch 条件下使用浮点数不起作用,为什么?
【发布时间】:2021-12-23 00:12:06
【问题描述】:

为什么浮点数不适用于 Switch?

【问题讨论】:

  • 1.因为语言定义是这样说的。 2. 因为比较浮点数是否完全相等(switch 语句隐含地这样做)通常是一个坏主意。 3. 因为使用浮点变量作为控制变量通常是个坏主意。
  • 如果你有一个具体的例子,你想写一段代码,它有一个浮点值上的switch 语句,你可能想问一下。回答的可能性很小,“是的,这行得通,可惜你不能使用switch,你必须使用if/else 链来代替。”但我们更有可能提出更好的编写方法。
  • @SteveSummit,这对于小数来说是正确的,但是小整数(最多约 1e6)可以完美地由 float 表示,并且它们可以安全地用于比较
  • @tstanisl 确实,这就是为什么我说“经常”而不是“总是”。
  • C 标准规定:“switch 语句的控制表达式应具有整数类型

标签: c switch-statement conditional-statements


【解决方案1】:

因为switch 依赖于精确,纯数据比较。

浮点数之间的比较可能不会像您期望的那样起作用,例如,有一个负零和一个正零,并且 0.1f+0.2f 与 0.3f 不同。

见:Is floating point math broken?

由于这些原因,作为人类,您不能“简单地”说“a == b”。这就是为什么 C 标准根本不允许它在 switch 中作为 case

事实是:您试图这样做是禁止它的充分理由!要么你在不应该使用浮点数(即存储一组有限的离散值),要么你还没有真正理解浮点数是如何工作的,在switch 语句中使用它们会导致意外行为。

【讨论】:

  • 但是你可以a == b!
  • @SteveSummit 是的,但浮点数的这种比较结果往往不是预期的。
  • 可以这么说,但这不是“简单”,也不是“从人类角度来看的正确结果”,这就是我使用 you can' 的原因t“简单地”说......当你的意思是,作为一个人,@SteveSummit
  • 我的抱怨是答案似乎是说该语言禁止在浮点值上使用==。现在好多了。
  • 另一个小笨蛋:您的3./5. != 0.6 示例非常好,或者会非常好,只是它是错误的!至少在我的计算机上,3.0f/5.0f 实际上与0.6f 完全相同(尽管两者都不等于有理数 3/5)。出人意料地失败的简单示例是0.1f + 0.2f,它不等于0.3,尽管它确实等于0.3f。然后0.1 + 0.2 不等于0.3。有趣,有趣。
【解决方案2】:

为什么我们不能在 switch 条件语句中使用浮点数?

  1. 因为语言定义是这样说的。

  2. 因为比较浮点数是否完全相等(switch 语句隐含地这样做)通常是一个坏主意。

  3. 因为使用浮点变量作为控制变量通常是个坏主意。 @Steve Summit

  4. 没有迫切需要此功能。

【讨论】:

  • 这个答案说的正是我所说的,更肤浅,但同样,所以我会把它当作一种恭维。
  • 我认为这个答案可能真的更多 - 并且是我答案的一个很好的选择!对于 2.-4.,你能详细说明一下吗?您只是将事情(我在回答中也已经说过)陈述为事实,但没有给出任何理由。您可能会看到与我不同的原因,但至少我的答案中包含了我的原因!
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2018-05-23
相关资源
最近更新 更多