擅长:python、mysql、java
<p>IEEE-754浮点数(32位)的简短汇总:</p>
<ul>
<li>1位符号(0表示正数,1表示负数)</li>
<li>8位指数(带-127偏差,此处不重要)</li>
<li>23位“尾数”</li>
<li>除了指数值0和255之外,可以将该值计算为:<code>(sign ? -1 : +1) * 2^exponent * (1.0 + mantissa)</code>
<ul>
<li>尾数位表示小数分隔符后面的<em>二进制</em>数字<em>,例如<code>1001 0000 0000 0000 0000 000 = 2^-1 + 2^-4 = .5 + .0625 = .5625</code>,小数分隔符前面的值不存储,而是隐式假设为1(如果指数为255,则假设为0,但这在这里并不重要),因此对于指数为30,例如,这个尾数示例表示值<code>1.5625</code></li>
</ul></li>
</ul>
<p>现在以你为例:</p>
<p>16777216正好是2<sup>24</sup>,将表示为32位浮点,如下所示:</p>
<ul>
<li>符号=0(正数)</li>
<li>指数=24(存储为24+127=151=<code>10010111</code>)</li>
<li>尾数=.0</li>
<li>作为32位浮点表示:<code>0 10010111 00000000000000000000000</code></li>
<li>因此:Value=<code>(+1) * 2^24 * (1.0 + .0) = 2^24 = 16777216</code></li>
</ul>
<p>现在让我们看看数字16777217,或者正好是2<sup>24</sup>+1:</p>
<ul>
<li>符号和指数相同</li>
<li>尾数必须正好是2<sup>-24</sup>,这样<code>(+1) * 2^24 * (1.0 + 2^-24) = 2^24 + 1 = 16777217</code></li>
<li><strong>这就是问题所在。</strong>尾数不能有值2<sup>-24</sup>,因为它只有23位,所以数字16777217不能用32位浮点数的精度来表示!</li>
</ul>