language-agnostic - 为什么在 IEEE754 标准中被零除会导致无限值?

标签 language-agnostic floating-point ieee-754

我很好奇,为什么在 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/

相关文章:

rust - 为什么 Rust 浮点值可以用很少的有效数字保存大值,而整数不能?

java - 如何对 float 进行舍入但保持 float (即不将其转换为 int)?

mysql - 设计困境 : If e-mail address already used, 发送电子邮件 "e-mail address already registered",但无法发送,因为无法将重复项添加到表中

c++ - 有没有办法获取正在运行或新打开的资源管理器窗口的IExplorerBrowser接口(interface),以便后续调用BrowseToXXX?

language-agnostic - 如何在纸上高效地编写代码

c - C中的数据序列化?

c++ - 我能保证 C++ 编译器不会重新排序我的计算吗?

c++ - 当通过 C/C++ 中的 double 传输时,是否保证保留 float ?

floating-point - 为什么为 NaN 保留这么多 float/double 值?

language-agnostic - "program to an interface"是什么意思?