如何打印IEEE754号码(没有printf)?

pax*_*blo 5 c printf ieee-754

出于这个问题的目的,我没有能力使用printf设施(不幸的是,我无法告诉你原因,但我们现在只是假设我知道我在做什么).

对于IEEE754单精度数,您有以下位:

SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
Run Code Online (Sandbox Code Playgroud)

S符号在哪里,E是指数,F是分数.

对于所有情况,打印符号都相对容易,因为捕获所有特殊情况,如NaN(E == 0xff, F != 0),Inf(E == 0xff, F == 0)和0(E == 0, F == 0,因为在这种情况下不使用指数偏差,所以认为是特殊情况).

我有两个问题.

第一个是如何最好地将非规范化数字(where E == 0, F != 0)转换为规范化数字(where 1 <= E <= 0xfe)?我怀疑这对于简化下一个问题的答案是必要的(但我可能是错的,所以随时教育我).

第二个问题是如何打印标准化数字.我希望能够以两种方式打印它们,指数式-3.74195E3和非指数型3741.95.虽然,只要看看这两个并排,通过移动小数点就可以很容易地将前者转变为后者.所以我们只关注指数形式.

我对我很久以前用于打印PI的算法进行了模糊的回忆,其中你使用了一个不断减少的公式,并对可能性保持上限和下限,在两个限制达成一致时输出一个数字,并通过因子10(因此,当上限和下限为3.2364和时3.1234,您可以输出3并在计算中进行调整).

但是自从我这么做以后已经很长时间了,所以我甚至都不知道这是否适合采取这种做法.这么看来,因为每个比特的值是一半前一比特的通过小数部分移动时(1/2,1/4,1/8等等).

除非绝对必要,否则我真的不想printf源代码中跋涉,如果有人可以帮忙解决这个问题,我将永远感激不尽.

Ric*_*gan 3

如果您希望每次转换都获得准确的结果,则必须使用任意精度算术,如 printf() 实现中所做的那样。如果您想获得“接近”的结果,可能仅在最低有效数字上有所不同,那么一个非常简单的基于双精度的算法就足够了:对于整数部分,重复除以十并将余数附加到形成十进制字符串(相反);对于小数部分,重复乘以十并减去整数部分以形成十进制字符串。

我最近写了一篇关于此方法的文章:http://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/。它不打印科学计数法,但添加它应该很简单。该算法打印次正常数字(我打印的数字准确无误,但您必须进行更彻底的测试)。