浮点量(在大多数情况下,不仅仅是 C)由三个数字定义:符号、有效数字(也称为“尾数”)和指数。\n它们组合起来形成一个伪实数形式
\nsign \xc3\x97 significand \xc3\x97 2exponent
这与科学计数法类似,只不过数字都是二进制的,并且乘法是2的幂,而不是10的幂。
\n例如,数字 4.000 可以表示为
\n+1 \xc3\x97 1 \xc3\x97 22
数字 768.000 可以表示为
\n+1 \xc3\x97 1.5 \xc3\x97 29
数字-0.625可以表示为
\n-1 \xc3\x97 1.25 \xc3\x97 2-1
数字 5.375 可以表示为
\n+1 \xc3\x97 1.34375 \xc3\x97 22
在任何特定的浮点格式中,您可以将不同的位数分配给不同的部分。符号始终为 0(正)或 1(负),因此您只需要一位即可。分配给有效数的位数越多,数字的精度就越高。分配给指数的位数越多,数字的范围就越大。
\n例如,IEEE 754 单精度浮点的尾数总共有 24 位精度(是的,比表中标注的精度多一位,因为实际上有一位额外或“隐藏”位)。因此,单精度浮点具有相当于 log 10 (2 24 ) 或大约 7.2 位小数的精度。它有 8 位指数,这给我们提供了大约 \xc2\xb1127 的指数值,这意味着我们可以乘以 2 \xc2\xb1127 ,给我们提供大约 \xc2\xb110 38的十进制范围。
\n当您开始深入研究实际浮点格式的细节时,还有一些细微差别需要考虑。您可能需要了解小数点(实际上是“二进制点”或“小数点”)相对于有效数字的位置。您可能需要了解“隐藏 1 位”以及次正规数的概念。您可能需要了解正指数和负指数的表示方式,通常通过使用偏差。您可能需要了解infinity的特殊表示以及“非数字”标记。您可以在维基百科有关浮点的文章中阅读所有这些通用术语,或者您可以阅读IEEE 754的详细信息浮点标准
\n一旦您了解了二进制浮点数“内部”的工作原理,它们的一些令人惊讶的特性就开始变得有意义了。例如,看似普通的小数 0.1并不是准确表示!在单精度下,您可以获得的最接近的是
\n+1 \xc3\x97 0x1.99999a \xc3\x97 2-4
或同等地
\n+1 \xc3\x97 1.60000002384185791015625 \xc3\x97 2-4
或同等地
\n+1 \xc3\x97 0b1.10011001100110011001101 \xc3\x97 2-4
计算结果约为 0.10000000149。我们根本无法获得比 \xe2\x80\x94 更精确的结果,我们无法在十进制等值 \xe2\x80\x94 中添加更多 0,因为有效数1.10011001100110011001101
我们的 1+ 23 个可用的单精度位。
您可以在这个规范的 SO 问题、这个问题和这个问题上阅读有关此类浮点“惊喜”的更多信息。
\n脚注:我说一切都是基于“形式的伪实数” ,但严格来说,它更像是“ 。即1位sign \xc3\x97 significand \xc3\x97 2exponent
-1sign \xc3\x97 significand \xc3\x97 2exponent
sign
分量为 0 表示正数,1 表示负数。
归档时间: |
|
查看次数: |
221 次 |
最近记录: |