Floating point 十进制到浮点-四舍五入逻辑

Floating point 十进制到浮点-四舍五入逻辑,floating-point,rounding,precision,Floating Point,Rounding,Precision,我知道有很多关于浮点数的问题,但是我仍然找不到我想要的 将1 000 000 032转换为浮点数是0 10011100 110111001101101100101000,而浮点数中实际存储的值是1.0E9,我理解为什么会发生这种情况。但是当我使用转换100000033时。浮点数中实际存储的值为1 000 000 064。为什么会这样?由于1 000 000 032的23个最高有效位与1 000 000 033的23个最高有效位相同,因此不要假设以十进制表示显示时所显示的就是所存储的。在显示十进制

我知道有很多关于浮点数的问题,但是我仍然找不到我想要的


1 000 000 032
转换为浮点数是
0 10011100 110111001101101100101000
,而浮点数中实际存储的值是
1.0E9
,我理解为什么会发生这种情况。但是当我使用转换
100000033
时。浮点数中实际存储的值为
1 000 000 064
。为什么会这样?由于
1 000 000 032
的23个最高有效位与
1 000 000 033

的23个最高有效位相同,因此不要假设以十进制表示显示时所显示的就是所存储的。在显示十进制值时,您将从二进制转换回十进制,并引入舍入和您选择的任何显示方式的表示规则-可能是某些库函数或调试器

例如FPrimtf%f格式说明符默认只考虑6个重要的十进制数字。


也就是说,1.0e9最有可能是显示的内容,而不是存储的内容。

当以十进制表示该显示时,不要假设显示的内容就是存储的内容。在显示十进制值时,您将从二进制转换回十进制,并引入舍入和您选择的任何显示方式的表示规则-可能是某些库函数或调试器

例如FPrimtf%f格式说明符默认只考虑6个重要的十进制数字。


也就是说,1.0e9最有可能是显示的,而不是存储的。

单精度浮点包含23位有效位和非有效位十进制数字

要了解值是如何舍入的,在以二进制形式写入值时更容易看到:

             ₁₂₃₄₅₆₇₈₉₀¹²³⁴⁵⁶⁷⁸⁹⁰₁₂₃₄₅₆₇₈₉₀
1000000000 = 111011100110101100101000000000 (0x4e6e6b28)
1000000032 = 111011100110101100101000100000
1000000033 = 111011100110101100101000100001
1000000064 = 111011100110101100101001000000 (0x4e6e6b29)
Truncated                            ^^^^^^
Normalized: 1.11011100110101100101000 x 2²⁹
指数为29时,这些值的闭合表示为1000000000和100000064,分别以单精度存储为
0x4e6e6b28
0x4e6b29
。如您所见,它们在最后一个位置仅相差一位

因此,当我们将1000000032和1000000033转换为24位有效位时,首先截断最后6位,然后应用适当的舍入。对于1000000033,很容易看出它比上一个更接近下一个可表示值(
10000000064
),所以它当然会被四舍五入。但是1000000032正好介于这些值之间,因此选择IEEE-754标准规定的允许舍入模式之一取决于实现:

该标准定义了五个舍入规则。前两个规则四舍五入到最接近的值;其他称为定向环行:

最近的环岛
  • 四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字中途下降,则使用偶数(零)最低有效位四舍五入到最接近的值这是二进制浮点的默认值,也是十进制的建议默认值
  • 四舍五入到最近值,远离零-四舍五入到最近值;如果数字下降到一半,则四舍五入到最接近的值(正数)或以下(负数);这是作为十进制浮点的一个选项

看起来这里使用了推荐的偶数关系规则。同样,由于偶数规则的关系,1000000096将四舍五入为1000000128

您可以查看转换引起的
错误
字段,看到1000000032、1000000033和1000000096的错误分别为-32、31和32

您也可以尝试,这将提供更有用的表示,并清楚地说明它如何舍入值

这是一个十进制到二进制的浮点转换器。它将十进制数转换为最接近的单精度和双精度IEEE 754二进制浮点数,使用将一半舍入为偶数舍入(默认IEEE舍入模式)。它是用任意精度的算法实现的,因此它的转换是正确的四舍五入。它将转换正常数和次正常数,并将溢出(到无穷大)或下溢(到零)的数转换


单精度浮点包含23位有效位和非有效位十进制数字

要了解值是如何舍入的,在以二进制形式写入值时更容易看到:

             ₁₂₃₄₅₆₇₈₉₀¹²³⁴⁵⁶⁷⁸⁹⁰₁₂₃₄₅₆₇₈₉₀
1000000000 = 111011100110101100101000000000 (0x4e6e6b28)
1000000032 = 111011100110101100101000100000
1000000033 = 111011100110101100101000100001
1000000064 = 111011100110101100101001000000 (0x4e6e6b29)
Truncated                            ^^^^^^
Normalized: 1.11011100110101100101000 x 2²⁹
指数为29时,这些值的闭合表示为1000000000和100000064,分别以单精度存储为
0x4e6e6b28
0x4e6b29
。如您所见,它们在最后一个位置仅相差一位

因此,当我们将1000000032和1000000033转换为24位有效位时,首先截断最后6位,然后应用适当的舍入。对于1000000033,很容易看出它比上一个更接近下一个可表示值(
10000000064
),所以它当然会被四舍五入。但是1000000032正好介于这些值之间,因此选择IEEE-754标准规定的允许舍入模式之一取决于实现:

该标准定义了五个舍入规则。前两个规则四舍五入到最接近的值;其他称为定向环行:

最近的环岛
  • 四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字中途下降,则使用偶数(零)最低有效位四舍五入到最接近的值这是二进制浮点的默认值,也是十进制的建议默认值
  • 四舍五入到最近值,远离零-四舍五入到最近值;如果数字降到中间,则四舍五入到ne