刚开始自己不明白最大绝对值 2-
是怎么来的,记录下
IEEE 754标准
IEEE 754标准浮点数格式:
-
阶码用移码表示
-
移码=阶码真值+偏置值
-
阶码真值=移码-偏置值
-
偏置值的公式为:2n−1−1{\large {\color{Green} 2^{n-1}-1}}2n−1−1
-
移码(这里的
移码看作无符号数
)的表示范围为:0∼2n−1{\large {\color{Green}0\sim 2^{n}-1}}0∼2n−1 -
尾数用原码表示
-
隐含最高数位1
-
阶码全1和阶码全0用作特殊用途
IEEE 754浮点数格式:
类型 | 数符 | 阶码 | 尾数数值 | 总位数 | 偏置值 | |
十六进制 | 十进制 | |||||
短浮点数 | 1 | 8 | 23 | 32 | 7FH | 127 |
长浮点数 | 1 | 11 | 52 | 64 | 3FFH | 1023 |
临时浮点数 | 1 | 15 | 64 | 80 | 3FFFH | 16383 |
浮点数的最大值和最小值
IEEE 754规格化浮点数的最大值和最小值,可以先根据最大绝对值,改变符号位即可
浮点数的最大绝对值
浮点数规格化的阶码决定了数值的大小,因此找最大绝对值,就需要首先确认最大的阶码真值,然后再确定尾数部分最大
因此找最大绝对值需要确定最大阶码和确定最大尾数
我们拿短浮点数(单精度、float型)举例(长浮点数同理)。
已经知道 阶码真值=移码−偏偏置值{ {\color{Purple} 阶码真值=移码-偏偏置值} }阶码真值=移码−偏偏置值 ,因此,最大的阶码=最大的移码−偏置值{ {\color{Purple} 最大的阶码=最大的移码-偏置值} }最大的阶码=最大的移码−偏置值
短浮点数得阶码占8{\large {\color{Green} 8}}8位,根据移码公式可以算出:0∼28−1的取值范围为0∼255{{\color{Green} 0 \sim 2^{8}-1}{ \color{Purple} 的取值范围为} {\color{Green} 0 \sim 255}}0∼28−1的取值范围为0∼255
由于全1和全0用作特殊用途,所以我们能取得最大的移码是254{ {\color{Green} 254}}254;
根据偏置值公式可以算出:28−1−1{ {\color{Green} 2^{8-1}-1}}28−1−1,偏置值为127{ {\color{Green} 127}}127
由公式阶码真值=移码−偏偏置值{{\color{Purple} 阶码真值=移码-偏偏置值} }阶码真值=移码−偏偏置值可以求出最大阶码真值能取得254−127=127{\large {\color{Green} 254-127=127}}254−127=127。求出最大阶码,再求最大尾数部分
短浮点数的尾数部分占23{\large {\color{Green} 23}}23位,我们把23{\large {\color{Green} 23}}23位数值位全部取1
就是最大值,再加上隐含的最高位1
,得出:1.1111 1111 1111 1111 1111 111{\large {\color{Green} 1.1111\ 1111\ 1111\ 1111\ 1111\ 111} }1.1111 1111 1111 1111 1111 111
组合到一块就是: 1.1111 1111 1111 1111 1111 111×2127{\large {\color{Green} 1.1111\ 1111\ 1111\ 1111\ 1111\ 111} \times {\color{Orange} 2^{127}} }1.1111 1111 1111 1111 1111 111×2127
但是这么多位1存在很麻烦,我们化简一下:1.1111 1111 1111 1111 1111 111=2−0.0000 0000 0000 0000 0000 001{\large {\color{Green} 1.1111\ 1111\ 1111\ 1111\ 1111\ 111} = {\color{Orange} 2-0.0000\ 0000\ 0000\ 0000\ 0000\ 001} }1.1111 1111 1111 1111 1111 111=2−0.0000 0000 0000 0000 0000 001
最后得到:(2−2−23)×2127{\large {\color{Red} \left ( 2-2^{-23} \right )\times 2^{127} }}(2−2−23)×2127
浮点数的最小绝对值
和最大绝对值一样,只需要让阶码真值最小,尾数部分最小即可
继续拿短浮点数举例。
上面已经求出短浮点数移码的表示范围,短浮点数得阶码占8{ {\color{Green} 8}}8位,根据移码公式可以算出:0∼28−1的取值范围为0∼255{{\color{Green}0\sim 2^{8}-1}{\color{Purple} 的取值范围为} {\color{Green}0\sim255}}0∼28−1的取值范围为0∼255,偏置值为127{{\color{Green} 127}}127
由于移码的全1和全0用作特殊用途,所以我们能取得最小的移码是1{{\color{Green} 1}}1;
由公式阶码真值=移码−偏偏置值{{\color{Purple} 阶码真值=移码-偏偏置值} }阶码真值=移码−偏偏置值可以求出最大阶码真值能取得1−127=−126{ {\color{Green} 1-127=-126}}1−127=−126。求出最小阶码,再求最小尾数部分
短浮点数的尾数部分占23{ {\color{Green} 23}}23位,我们把23{ {\color{Green} 23}}23位数值位全部取0
就是最小值,再加上隐含的最高位1
,得出:1.0000 0000 0000 0000 0000 000{ {\color{Green} 1.0000\ 0000\ 0000\ 0000\ 0000\ 000} }1.0000 0000 0000 0000 0000 000
最后得到:1.0×2−126{ {\color{Red} 1.0\times 2^{-126} }}1.0×2−126
浮点数的最大值
将绝对值改变符号即可
短浮点数所能表示的最大规格化正数:
(2−2−23)×2127{ {\color{Red} \left ( 2-2^{-23} \right )\times 2^{127} }}(2−2−23)×2127
短浮点数所能表示的最大规格化负数:
−1.0×2−126{{\color{Red} -1.0\times 2^{-126} }}−1.0×2−126
浮点数的最小值
将绝对值改变符号即可
短浮点数所能表示的最小规格化正数:
1.0×2−126{ {\color{Red} 1.0\times 2^{-126} }}1.0×2−126
短浮点数所能表示的最小规格化负数:
−(2−2−23)×2127{ {\color{Red} -\left ( 2-2^{-23} \right )\times 2^{127} }}−(2−2−23)×2127