C 中的浮点数由哪几部分组成?

Ibt*_*med 0 c floating-point

单精度浮点:
符号位:1
指数:8位
尾数:23位

双精度浮点:
符号位:1
指数:11位
尾数:52位

这个信息是什么意思?我不太了解英语术语。

Ste*_*mit 8

浮点量(在大多数情况下,不仅仅是 C)由三个数字定义:符号有效数字(也称为“尾数”)和指数。\n它们组合起来形成一个伪实数形式

\n

sign \xc3\x97 significand \xc3\x97 2exponent

\n

这与科学计数法类似,只不过数字都是二进制的,并且乘法是2的幂,而不是10的幂。

\n

例如,数字 4.000 可以表示为

\n

+1 \xc3\x97 1 \xc3\x97 22

\n

数字 768.000 可以表示为

\n

+1 \xc3\x97 1.5 \xc3\x97 29

\n

数字-0.625可以表示为

\n

-1 \xc3\x97 1.25 \xc3\x97 2-1

\n

数字 5.375 可以表示为

\n

+1 \xc3\x97 1.34375 \xc3\x97 22

\n

在任何特定的浮点格式中,您可以将不同的位数分配给不同的部分。符号始终为 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

或同等地

\n

+1 \xc3\x97 1.60000002384185791015625 \xc3\x97 2-4

\n

或同等地

\n

+1 \xc3\x97 0b1.10011001100110011001101 \xc3\x97 2-4

\n

计算结果约为 0.10000000149。我们根本无法获得比 \xe2\x80\x94 更精确的结果,我们无法在十进制等值 \xe2\x80\x94 中添加更多 0,因为有效数1.10011001100110011001101我们的 1+ 23 个可用的单精度位。

\n

您可以在这个规范的 SO 问题这个问题这个问题上阅读有关此类浮点“惊喜”的更多信息

\n
\n

脚注:我说一切都是基于“形式的伪实数” ,但严格来说,它更像是“ 。即1位sign \xc3\x97 significand \xc3\x97 2exponent-1sign \xc3\x97 significand \xc3\x97 2exponentsign分量为 0 表示正数,1 表示负数。

\n

  • 使用 <sup>exponent</sup> 代替指数要好得多,因为 `^` 很容易与异或混淆 (2认同)