出于这个问题的目的,我没有使用printf
设施的能力(不幸的是,我不能告诉你为什么,但现在让我们假设我知道我在做什么)。
对于 IEEE754 单精度数,您有以下位:
SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
其中S
是符号,E
是指数,F
是分数。
在所有情况下打印符号都相对容易,因为捕获所有特殊情况,如NaN
( E == 0xff, F != 0
)、Inf
( E == 0xff, F == 0
) 和0
( E == 0, F == 0
,被认为是特殊的,因为在这种情况下不使用指数偏差)。
我有两个问题。
首先是如何最好地将非规范化数字(哪里E == 0, F != 0
)转换为规范化数字(哪里1 <= E <= 0xfe
)?我怀疑这对于简化下一个问题的答案是必要的(但我可能是错的,所以请随时教育我)。
第二个问题是如何打印出标准化的数字。我希望能够以两种方式将它们打印出来,指数类-3.74195E3
和非指数类3741.95
。虽然,只是并排看这两个,通过移动小数点应该很容易将前者变成后者。所以让我们只关注指数形式。
我对我很久以前用于打印 PI 的算法有一个模糊的回忆,其中您使用了一个不断减少的公式并保持可能性的上限和下限,当两个限制一致时输出一个数字,并将计算转移因子 10(因此当上限和下限为
3.2364
和3.1234
时,您可以3
在计算中输出和调整)。但是我已经很久没有这样做了,所以我什至不知道这是否适合在这里采取。似乎是这样,因为当通过小数部分(
1/2
、1/4
等1/8
)时,每个位的值是前一个位的一半。
除非绝对必要,否则我真的希望不必费力地阅读printf
源代码,因此,如果有人可以提供帮助,我将永远感激不尽。