我正在根据 Single UNIX 规范制作自己的 od 实用程序,并且我对如何处理浮点数的表示感到困惑,例如od -t f
。我有一个功能完善的实用程序,否则它能够处理规范的所有其他部分,这也不是一个编程问题,而是一个关于转储为浮点数时输出含义的问题。
例如,如果我执行以下程序,向标准输入提供 ASCII 字符一个我得到以下信息:
$ od -A n -t fD -
1.297e-320
如果我只提供A
$ od -A n -t fD -
3.2e-322
我知道 A 和换行符的值分别是 65 和 10,所以我不知道这些指数级的小数字在上下文中意味着什么。该规范没有对浮点数进行太多介绍,因此我希望获得有关这一点的任何信息。
答案1
在小端系统上,这是内存中字符串、浮点数和双精度数表示的结果。以“A”、65 或 0x41 开头,作为浮点数 ( od -t fF
) 对应于
00000000000000000000000001000001
即 9.1⋅10 -44(参见这个方便的转换器) — 0 位表示符号(正),0 指数(有偏差,对于浮点数为 -126),以及一个分数 2 -17 + 2 -23。因此,表示的值为 (2 -17 + 2 -23 ) × 2 -126(参见沃尔夫勒姆·阿尔法)。添加换行符会产生
00000000000000000000101001000001
即 3.678⋅10 -42。
使用双精度数 ( od -t fD
) 会在数字前面添加另外四个字节的零,这不会更改符号或指数,并进一步减少分数,这除了双精度数 (-1022) 的更大偏差之外,还导致您看到的数字非常小(请参阅这个使用双精度的另一个转换器):“A”为 (2 -46 + 2 -52 ) × 2 -1022(参见沃尔夫勒姆·阿尔法),“A”后跟换行符为 (2 -41 + 2 -43 + 2 -46 + 2 -52 ) × 2 -1022(参见沃尔夫勒姆·阿尔法)。