将浮点数拆分为另外两个数字的总和,没有舍入错误
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-60
。 f + 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
和另一个值的总和。
我不知道是否可以这样做,但我需要将一个浮点数拆分为两个数字的总和...
例如,假设 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-60
。 f + 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
和另一个值的总和。