我很好奇,为什么在 IEEE-754
中任何非零 float 除以零都会得到无限值?从数学的角度来看,这是无稽之谈。所以我认为这个操作的正确结果是 NaN。
函数 f(x) = 1/x 在 x=0 时没有定义,如果 x 是实数。例如,如果 IEEE-754
生成 NaN
值,则函数 sqrt 未定义任何负数和 sqrt(-1.0f)。但是 1.0f/0 是 Inf
。
但由于某些原因,IEEE-754
中并非如此。这一定是有原因的,也许是一些优化或兼容性原因。
那有什么意义呢?
最佳答案
It's a nonsense from the mathematical perspective.
是的。不,有点。
事实是: float 是近似值。您希望使用范围广泛的指数和有限数量的数字并获得并非完全错误的结果。 :)
IEEE-754 背后的想法是每个操作都可能触发“陷阱”以指示可能出现的问题。他们是
- 非法(无意义的操作,如负数的平方)
- 溢出(太大)
- 下溢(太小)
- 除以零(你不喜欢的东西)
- 不精确(此操作可能会给您错误的结果,因为您失去了精度)
现在很多人,比如科学家和工程师,都不想为编写陷阱例程而烦恼。因此,IEEE-754 的发明者 Kahan 决定,如果不存在陷阱例程,每个操作也应该返回一个合理的默认值。
他们是
- NaN 表示非法值
- 溢出的符号无穷大
- 下溢的有符号零
- NaN 用于不确定结果 (0/0) 和无穷大 (x/0 x != 0)
- Inexact 的正常运行结果
事实是,在 99% 的所有情况下,零是由下溢引起的,因此在 99% 的情况下 在任何时候,无穷大都是“正确的”,即使从数学角度来看是错误的。
关于language-agnostic - 为什么在 IEEE754 标准中被零除会导致无限值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32605145/