0.1 in 小数二进制表示是:0.000[1100]
对于问题 2.46 中的近似,有一个cutoff在位置 23 之后,以及问题 2.51 a 中四舍五入到偶数发生在位置 23。后者意味着: - 1)转到最近的值 - 或 2)如果正好在中间,则转到偶数。由于位置 24 ff 是11001100...
这是情况 1),最接近的值是当位置 23 变为 1 时。原始值和近似值的位:
x = 0.0001100110011001100110011001100110011001100...
x_246 = 0.00011001100110011001100 # cutoff
x_251 = 0.00011001100110011001101 # round to even - as asked in A)
区别x' - 0.1
, i.e. x_251 - x
,如 B) 中所问
-
小数二进制
x_251: 0.00011001100110011001101
x: - 0.0001100110011001100110011001100110011001100...
fdiff: 0.0000000000000000000000000110011001100110011... or
fdiff: 0.0 0000 0000 0000 0000 0000 0000[1100]
--> this answers "question for (B) is that how do we get x' - 0.1
== 0.0 0000 0000 0000 0000 0000 0000[1100]"
-
小数值
ddiff = (1*2^-26 + 1*2^-27) + (1*2^-30 + A1*2^-31) + (...) + ...
= 3*2^-27 + 3*2^-31 + 3*2^-35 + ...
= 0.1*2^-22 = 2.384e-8 (sum of geometric serie)
julia> @printf "%.40f" 0.1*2.0^-22
0.0000000238418579101562513234889800848443
旁白:为什么有区别julia> @printf "%.40f" 0.1f0
和上面的小数差ddiff?
0.1000000014901161193847656250000000000000
0.0000000238418579101562513234889800848443
0.1f0
表示为IEEE 浮点值。位(julia> bits(f0.1f0)
) ("00111101110011001100110011001101") 的含义如下:
0 01111011 10011001100110011001101
| | | M = 1 + f
| | E = e - Bias = 123 - 127 = -4 --> V = M*2^-4 (right shift M by 4)
| sign
M: 1.10011001100110011001101
M/sh: 0.0001.10011001100110011001101
x_shifted: 0.000110011001100110011001101
x_251: 0.00011001100110011001101
--> 0.1 的移位近似值比 x_251 多 4 位。差值的十进制值x_shifted - x
(如上计算)给出:0.1*2^-26。现在这两种表示法是合适的:
julia> @printf "%.40f" 0.1*2.0^-26
0.0000000014901161193847657077180612553028
0.1000000014901161193847656250000000000000 # julia> @printf "%.40f" 0.1f0