将浮点数拆分为另外两个数字的总和,没有舍入错误

Splitting a floating point number into a sum of two other numbers, without rounding errors

我不知道是否可以这样做,但我需要将一个浮点数拆分为两个数字的总和...

例如,假设 x 是一个浮点数,我们想将其拆分为 x = I + f,其中 I 是带符号的整数部分,而 f 是带符号的小数部分,我猜这两个浮点数都可以准确地实现这种分割(即我的意思是没有 fp 错误)。

我想知道是否有可能以某种方式拆分 x = (I-1.0) + (f + 1.0),即没有浮点舍入误差。

我自己实现了拆分 x = I + f 然后求和并添加 1.0 我提出了第二个拆分,但基本上它受到浮点舍入的影响错误这样的操作。

(示例使用双精度)

I was wondering if it is possible to split somehow x = (I-1.0) + (f + 1.0), namely without floating point rounding error.

不可能对所有值都进行这样的拆分。取0x1.0p-60,整数部分为0.0,小数部分为0x1.0p-60f + 1.0 不精确并生成 1.0,而 I-1.0 精确并生成 -1.0.

不仅仅是 f + 1.0 中的加法不准确:当添加 -1.0 时产生 0x1.0p-60 的浮点值并不存在。

一个浮点值v总是可以精确地拆分为fmod(v, 1.0)v - fmod(v, 1.0)的和,其中后者是一个整数,至少还有另一种方式使用 IEEE 754 “Floating-point remainder” 在整数部分和小数部分之间精确地拆分 v,这与 fmod 有细微的区别,但是没有办法将接近 0 的数字拆分为浮点数1.0 和另一个值的总和。