Formatting 单精度IEEE 754浮点数的格式
我需要以一种不会丢失任何信息的方式将单精度数字表示为文本(这样我可以取回相同的数字,可能不考虑NaNs等),但不需要太多的伪数字-因此单精度0.1显示为“0.1”,而不是“0.100000001490116” 我不想保存字节,这些额外的数字只是让人困惑 有没有一个简单的方法可以做到这一点?我可以看到,至少需要8位有效的十进制数字来表示23+1位(12345678.0和12345679.0在单精度上是不同的),使用二进制指数(Formatting 单精度IEEE 754浮点数的格式,formatting,floating-point,Formatting,Floating Point,我需要以一种不会丢失任何信息的方式将单精度数字表示为文本(这样我可以取回相同的数字,可能不考虑NaNs等),但不需要太多的伪数字-因此单精度0.1显示为“0.1”,而不是“0.100000001490116” 我不想保存字节,这些额外的数字只是让人困惑 有没有一个简单的方法可以做到这一点?我可以看到,至少需要8位有效的十进制数字来表示23+1位(12345678.0和12345679.0在单精度上是不同的),使用二进制指数(12345b-11某种表示法)就足够了,但这能保证足够用十进制指数表示法
12345b-11
某种表示法)就足够了,但这能保证足够用十进制指数表示法(1.2345e+6
)还是使用0填充的(0.0000123456
——通常可读性更高,而这些零对我来说不太麻烦)
任何
printf
格式或精确的说明都是值得赞赏的。正确完成这项任务是一项非常重要的任务:这个问题涉及多篇学术论文
许多开源项目使用David M.Gay的库来实现这一点。如果您使用Python,最近(2.7/3)发布了基于dtoa.c的舍入,关于相关任务的讨论非常值得:
- 迈克·考利肖的
- David M.Gay的论文描述了dtoa.c
“0.1”
是浮点数的完美有效表示形式,通常编码为3D CC CD
,如“1.0e-1”
,“0.10000002”
,“0.099999842”
,以及许多其他格式化字符串。通常编码为3D CC CD
的浮点数在数学上正好等于0.1000000000001490116119384765625(0xCCCD*2**-27),但这是非常不方便的表示法。您正在寻找往返表示法,对吗?我的建议是(使用十进制浮点而不是二进制),尽管我知道这在您的情况下可能不可行。否则,您将面临一个基本上不可能完成的任务—您如何知道您的表示是否“正确”?还是你保留了数字的原始十进制表示法?再说一遍,我没有。数据已经存在,它是单精度浮点,就这样。其他一切都是用户界面。哎哟,这看起来比我想象的要混乱得多。幸运的是,我并不每次都需要完美的表示,所以我将尝试使用“%g”
进行低精度转换,如果它不能转换回正确的答案,我将返回到带有所有伪数字的标准库代码。