Formatting 单精度IEEE 754浮点数的格式

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某种表示法)就足够了,但这能保证足够用十进制指数表示法

我需要以一种不会丢失任何信息的方式将单精度数字表示为文本(这样我可以取回相同的数字,可能不考虑NaNs等),但不需要太多的伪数字-因此单精度0.1显示为“0.1”,而不是“0.100000001490116”

我不想保存字节,这些额外的数字只是让人困惑

有没有一个简单的方法可以做到这一点?我可以看到,至少需要8位有效的十进制数字来表示23+1位(12345678.0和12345679.0在单精度上是不同的),使用二进制指数(
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不能用(二进制)浮点数精确表示?如果你从0.1创建一个浮点,你不能再次得到0.1,除非你舍入。或者你正在考虑使用内置浮点类型的替代方法吗?如果你想做的是精确地表示十进制数(在给定的范围内),考虑你选择的语言中使用的十进制浮点类型。你完全误解了这个问题——它是关于将单精度IEEE 754浮点数字表示为文本小数,而不是相反,你误读了它
“0.1”
是浮点数的完美有效表示形式,通常编码为
3D CC CD
,如
“1.0e-1”
“0.10000002”
“0.099999842”
,以及许多其他格式化字符串。通常编码为
3D CC CD
的浮点数在数学上正好等于0.1000000000001490116119384765625(0xCCCD*2**-27),但这是非常不方便的表示法。您正在寻找往返表示法,对吗?我的建议是(使用十进制浮点而不是二进制),尽管我知道这在您的情况下可能不可行。否则,您将面临一个基本上不可能完成的任务—您如何知道您的表示是否“正确”?还是你保留了数字的原始十进制表示法?再说一遍,我没有。数据已经存在,它是单精度浮点,就这样。其他一切都是用户界面。哎哟,这看起来比我想象的要混乱得多。幸运的是,我并不每次都需要完美的表示,所以我将尝试使用
“%g”
进行低精度转换,如果它不能转换回正确的答案,我将返回到带有所有伪数字的标准库代码。