Floating point IEEE754除法精度

Floating point IEEE754除法精度,floating-point,floating-accuracy,Floating Point,Floating Accuracy,从IEEE754,我读到 […]每项操作[…]的执行应如同第一次生产中间体一样 结果修正到无限精度和无限范围,然后四舍五入 结果[…] 我的理解是,当双精度1.0108552519184509e+76(0x4FB6593CEBC97CC5)除以4.1777521369084075e+147(0x5E94E917A9CC65DC)时,理论中间分数部分为 (二进制) 并应四舍五入到(四舍五入模式“最近”) 导致商2.41961518728705e-72(0x311119B130D4ADEF) 此处的

从IEEE754,我读到

[…]每项操作[…]的执行应如同第一次生产中间体一样 结果修正到无限精度和无限范围,然后四舍五入 结果[…]

我的理解是,当双精度
1.0108552519184509e+76
0x4FB6593CEBC97CC5
)除以
4.1777521369084075e+147
0x5E94E917A9CC65DC
)时,理论中间分数部分为 (二进制)

并应四舍五入到(四舍五入模式“最近”)

导致商
2.41961518728705e-72
0x311119B130D4ADEF

此处的一个SW产生
2.4196151872870495e-72
0x311119B130D4ADEE
),这似乎表明它只计算到某个位置的中间分数,例如

1.000100011001101100010011000011010100101011011110111010000000000
然后转一圈


这符合IEEE754吗?这是一种常见的方法吗

有些语言允许额外的精度,这似乎就是这里发生的事情。我使用Java的BigDecimal将输入的精确表示法除以1000个小数位。结果以“2.41961518728704981667551454126246840709128039818330373577895299809290304758722566”开始,稍微接近较低的值

在给定的计算中是否允许额外的精度取决于语言规范


一般来说,浮点运算使用保护位来获得相同的结果,就好像计算已经精确完成,然后四舍五入一样。要进行最接近的正常四舍五入,系统需要知道将保留的位之外的一位,以及是否有任何较低意义位是一位的指示。

一些语言允许额外的精度,这似乎就是这里发生的情况。我使用Java的BigDecimal将输入的精确表示法除以1000个小数位。结果以“2.41961518728704981667551454126246840709128039818330373577895299809290304758722566”开始,稍微接近较低的值

在给定的计算中是否允许额外的精度取决于语言规范


一般来说,浮点运算使用保护位来获得相同的结果,就好像计算已经精确完成,然后四舍五入一样。要进行最接近的正常四舍五入,系统需要知道将要保留的位之外的一位,以及是否有任何较低重要性位是一位的指示。

在要求澄清后,问题是关于IEEE 754的,与编程语言无关。在这种情况下,以“四舍五入到最近”的方式获得所考虑分区的结果
2.4196151872870495e-72
,完全是不正确的。根据问题中的定义,正确的结果是
2.41961518728705e-72

[…]每项操作[…]的执行应视为首先产生一个中间结果,该结果精确到无限精度且范围无限,然后对该结果进行四舍五入[…]

实际情况是,大多数编程语言实现(通常是规范)并没有对浮点操作严格遵守IEEE 754语义给予太多强调。即使使用IEEE 754双精度表示法存储浮点值,操作也可能最终实现为:

  • 如果参数还不是具有64位有效位的80位浮点值,将双精度转换为该格式。这不会失去精度,本身也不会成为问题

  • 从80位操作数计算80位结果,因为这在使用8087指令集进行计算时很容易,无需额外努力

  • 在此之后或之后,将带有64位有效位的80位值转换为带有53位有效位的双精度值

在某些情况下,最后一步不是立即进行的,而是在编译器的突发奇想下进行的。这尤其令人讨厌,因为它使代码不确定性。添加不应影响计算的单独调试代码会改变80位寄存器的可用性,并导致其中一些寄存器被拆分和四舍五入到双精度,从而改变它们

即使对每个中间结果立即进行双精度存储,仍然存在一个问题,即结果已计算并正确舍入64位的有效位,然后再次舍入到53位。在某些情况下,数学结果接近两个双精度值之间的中点,将其四舍五入到64位有效位会将其拖到正中间。如果该结果及其64位有效位被四舍五入为53位,则最终结果与直接应用IEEE 754规则产生的值不同。只有当数学结果非常接近两个双精度数字之间的中点时,才会发生这种情况,因此两个答案几乎都是同样精确的答案,但其中一个是IEEE 754标准所说的,而不是另一个

这篇文章进一步说明了问题 阅读

注:

正如Patricia在回答中提到的,IEEE 754规定+、-、*、/和√ 计算时,应将数学结果(有时为无限位数)计算并四舍五入,即存在获得该结果的算法,而无需计算整个数学结果。当没有算法可以廉价地获得这种“正确舍入”的结果时,例如三角函数,标准并不强制要求这样做

因为您在一个页面上找到了一个解决方案,该页面解释了如何将387 FPU配置为直接以53位取整
1.0001000110011011000100110000110101001010110111101111
1.000100011001101100010011000011010100101011011110111010000000000