Floating point IEEE754除法精度
从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) 此处的
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位有效位的双精度值
1.0001000110011011000100110000110101001010110111101111
1.000100011001101100010011000011010100101011011110111010000000000