为了这个问题的目的,我做not有能力使用printf
设施(不幸的是,我无法告诉你原因,但我们现在假设我知道我在做什么)。
对于 IEEE754 单精度数,您具有以下位:
SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
where S
是标志,E
是指数并且F
是分数。
对于所有情况,打印标志都相对容易,捕获所有特殊情况(例如NaN
(E == 0xff, F != 0
), Inf
(E == 0xff, F == 0
) and 0
(E == 0, F == 0
,被认为是特殊的,只是因为在这种情况下不使用指数偏差)。
我有两个问题。
第一个是如何最好地转换非规范化数字(其中E == 0, F != 0
)转化为标准化数字(其中1 <= E <= 0xfe
)?我怀疑这对于简化下一个问题的答案是必要的(但我可能是错的,所以请随意教育我)。
第二个问题是如何打印出标准化后的数字。我希望能够以两种方式打印它们,比如指数-3.74195E3
和非指数类3741.95
。不过,只要并排看这两个,就可以很容易地通过移动小数点将前者变成后者。所以我们只关注指数形式。
我对很久以前用来打印 PI 的算法有一个模糊的记忆,其中使用一个不断减少的公式并保留可能性的上限和下限,当两个限制都同意时输出一个数字,并将计算移动系数 10(因此当上限和下限分别为3.2364
and 3.1234
,你可以输出3
并在计算中进行调整)。
但这已经是一个long自从我这样做以来已经有一段时间了,所以我什至不知道这是否是一个合适的方法。看起来是这样,因为当移动到小数部分时,每个位的值都是前一个位的一半(1/2
, 1/4
, 1/8
等等)。
我真的更喜欢not必须跋涉printf
除非绝对必要,否则源代码,如果有人可以帮助解决这个问题,我将永远感激不已。
如果您希望每次转换都获得准确的结果,则必须使用任意精度算术,如 printf() 实现中所做的那样。如果您想获得“接近”的结果,可能仅在最低有效数字上有所不同,那么一个非常简单的基于双精度的算法就足够了:对于整数部分,重复除以十并将余数附加到形成十进制字符串(相反);对于小数部分,重复乘以十并减去整数部分以形成十进制字符串。
我最近写了一篇关于这个方法的文章:http://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/ http://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/。它不打印科学计数法,但添加它应该很简单。该算法打印次正常数字(我打印的数字准确无误,但您必须进行更彻底的测试)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)