我正在尝试将双精度数转换为本机 NT 应用程序中的字符串,即仅依赖于ntdll.dll
。不幸的是,ntdll 的版本vsnprintf
不支持%f
等,迫使我自己实现转换。
之前所提ntdll.dll
只出口其中的一小部分math.h
功能 (floor
, ceil
, log
, pow
,...)。然而,我有理由确信我可以实现任何不可用的math.h
如果需要的话可以使用函数。
GNU 的 libc 中有一个浮点转换的实现,但是代码非常密集并且难以理解(GNU 缩进风格在这里没有帮助)。
我已经通过标准化数字来实现转换(即将数字乘以/除以 10,直到它位于区间内)[1, 10)
),然后通过用以下命令切除整数部分来生成每个数字modf
并将小数部分乘以 10。这可行,但会损失精度(只有前 15 位数字是正确的)。当然,精度损失是算法固有的。
我会选择 17 位数字,但是能够正确生成任意数量数字的算法将是首选。
您能否建议一个算法或为我指出一个好的资源?
双精度数的精度不超过 15 位有效(小数)位数。你绝对不可能得到“正确的任意位数”;double
s 不是大数。
既然您说您对 17 位有效数字感到满意,请使用long double
;我想,在 Windows 上,这将为您提供 19 位有效数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)