【问题标题】:C floating point: Can x/x be > 1.0?C 浮点数:x/x 可以 > 1.0 吗?
【发布时间】:2014-08-25 23:06:53
【问题描述】:

在 C 语言中,如果一个数除以自身,你能超过 1.0 吗?基本上,x/x(例如 5.1/5.1)最终会大于 1.0 吗? x 可以是 float、double 或 long double。请注意,x/x 不会是文字代码,就像变量 x 本身一样。

我尝试搜索此答案,但很难找到好的搜索词。

【问题讨论】:

  • 这里可能有 1000 个关于浮点精度的问题。还有指向What Every Computer Scientist Should Know About Floating-Point Arithmetic的必填链接
  • 我很清楚浮点的问题,因此是特定的问题。寻找这个特定问题的答案的问题是我得到了大量的“不要做(5/2 == 2.5)”。我知道这一点,但是很难弄清楚一个数字本身是否永远不等于 1.0(可能是由于类型提升的差异或谁知道)。我正在阅读您发送的链接,但看起来并不乐观。
  • @KenWhite 您链接到的文档与此处提出的具体问题无关。它描述了在 IEEE 754 或类似 IEEE 754 的浮点运算中 x/x 如何恰好是 1.0。问题是关于在 C 中会发生什么。整个问题取决于 C 编译器必须在多大程度上实现 IEEE 754 算术,而您链接到的文档对此只字未提。一个 100 多页的链接只提供可以用一句话概括的相关信息是没有帮助的。
  • 你到底在问什么? “注意 x/x 不会是文字代码,就像变量 x 本身一样”是什么意思?
  • @Ryan:什么样的人?人类知道浮点运算的工作原理吗?

标签: floating-point floating-point-precision


【解决方案1】:

假设符合 IEEE-754,x/x 始终完全是 1.0*,因为除法是正确舍入的基本运算,这意味着它返回最接近“无限精确”数学值的浮点数。

但是,有一些陷阱。例如,如果FLT_EVAL_METHOD 在您的 C 实现中非零,而x 实际上是类似(a+b)/(a+b) 的表达式,那么可以想象(不太可能,但已经观察到)在某些优化设置下,结果可能不完全等于1.0。当然,如果您的编译器不符合 IEEE-754,那么所有的赌注都将失败。

[*] 或 NaN,如果 x 为零或无穷大或 NaN。

【讨论】:

  • x/x 可以是 1.0 或 NaN。 (两者都不大于1.0。)
  • @StephenCanon 谢谢。这正是我想要的。
  • 我在做线性插值:(x - from_min) / (from_max - from_min) * (to_max - to_min) + to_min;您的回答似乎表明我最终得到的结果可能略大于to_max,并且可能小于to_min。据你所知,这是正确的吗?
  • @LeviMorrison 您的评论根本不是评论,而是一个新问题(答案是肯定的,您的计算结果可能大于to_max,并不是因为 FLT_EVAL_METHOD,这将事实上,如果已知非零,但通常是因为浮点运算,则有帮助。有关类似示例,请参阅stackoverflow.com/questions/13725802/…
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多