Vla*_*eev 6 floating-point floating-accuracy ieee-754
我需要以人类可读的文本形式表示IEEE 754-1985双(64位)浮点数,条件是文本形式可以被解析回完全相同(逐位)的数字.
如果不打印原始字节,这可行/实用吗?如果是,那么执行此操作的代码将非常感激.
Ste*_*non 12
最佳选择:使用C99十六进制浮点格式:
printf("%a", someDouble);
Run Code Online (Sandbox Code Playgroud)
以这种方式生成的字符串可以转换回doubleC99 strtod( )函数,也可以转换为scanf( )函数.其他几种语言也支持这种格式.一些例子:
decimal number %a format meaning
--------------------------------------------
2.0 0x1.0p1 1.0 * 2^1
0.75 0x1.8p-1 1.5 * 2^-1
Run Code Online (Sandbox Code Playgroud)
十六进制格式的优点是所有表示都是精确的.因此,将字符串转换回浮点将始终给出原始数字,即使有人更改了执行转换的舍入模式.对于不精确的格式,情况并非如此.
如果您不想出于任何原因使用十六进制格式,并且愿意假设舍入模式将始终舍入到最接近(默认值),那么您可以将数据格式化为小数,且至少为17有效数字.如果你有一个正确的舍入转换程序(大多数 - 不是所有 - 平台都这样做),这将保证你可以从双到达并返回往返,而不会有任何精度损失.
听起来像你想要的汉堡算法(PDF):
在自由格式模式下,算法生成最短的正确舍入的输出字符串,无论读取器在舍入时如何断开连接,都会在读回时转换为相同的数字.
样本源代码(在C和Scheme中)也是可用的.
这是Python 3.x中使用的算法,以确保floats可以转换为字符串并返回而不会丢失任何精度.在Python 2.x中,floats始终用17位有效数字表示,因为:
repr(float)产生了17位有效数字,因为事实证明它足够(在大多数机器上),因此eval(repr(x)) == x确切地适用于所有有限浮点数x,但是舍入到16位数不足以使其成为真实数字.(来源:http://docs.python.org/tutorial/floatingpoint.html)