floating-point - IEEE float 舍入

标签 floating-point ieee-754

对于 IEEE float ,为什么它们等于 epsilon m?

(1 - 1e-16) - 1 ans = -1.1102e-16

1 + (1e-16 - 1) ans = 1.1102e-16

而另一方面,低于等于 0

(1 + 1e-16) - 1 ans = 0

谁能告诉我为什么?对于最后一个,我明白了 fl(x) = 1 对于 1 ≤ x ≤ 1 + M 和 fl(x) = 1 + 2 M 对于 1 + M < x ≤ 1 + 2 M

前两个不应该等于 0 因为 fl(x) = 1 对于 1 - M < x ≤ 1 和 fl(x) = 1 - 2 M 对于 1 - 2M ≤ x ≤ 1 - M ?

最佳答案

Machine epsilon并不是一个真正定义明确的术语,因为不同的来源和语言以不同的方式定义它。

如果我们取 M 为 2-53 ≈ 1.11 × 10-16(即 1 与前一个 float 之间的差距数,或 1 和下一个 float 之间的差距的一半)然后 1 附近的 float 线看起来像:

--|----|----|----|---------|---------|------
     1-2M  1-M   1        1+2M      1+4M

所以,在标准的最接近的舍入,偶数的关系下,我们有

  • fl(x) = 1-M 对于 1 - 3M/2 < x < 1 - M/2
  • fl(x) = 1 对于 1 - M/2 ≤ x ≤ 1 + M
  • fl(x) = 1+2M 对于 1 + M < x < 1 + 3M

所以在第一种情况下,1 - 1e-16 将四舍五入为 1 - M,而在第二种情况下 1 + 1e-16 将四舍五入为 1

关于floating-point - IEEE float 舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37561378/

相关文章:

c++ - 使用 C++ 输入运算符读取 float

c++ - 浮点表示在 C++ 中是否依赖于编译器?

string - 如何将 float 转换为字符串

c - 将 32 位无符号 long 解释为 C 中的单精度 IEEE-754 float

c - 在 C 中,指定 2.0f 是否与 2.000000f 相同?

java - 将位转换为 double 后,如何在不使用 BigDecimal 的情况下存储实际的浮点/ double 值?

c++ - 如何在现代 C++ 中将 float 转换为 int

javascript - 将 javascript 数字转换为 float (单精度 IEEE-754)并接收整数位

c# - 强制 float 在 .NET 中是确定性的?

javascript - 为什么dojo.number.format在不同的浏览器中返回不同的结果?