我需要表示IEEE 754-1985双(64位)漂浮在人类可读文本形式点数目,条件是所述文本形式可被解析回准确的条件相同(按位)数。

这是可能/实用而不只是打印原始字节做什么? 如果是,代码要做到这一点,将不胜感激。

有帮助吗?

解决方案

最佳选项:使用C99十六进制浮点格式:

printf("%a", someDouble);

的字符串生成这种方式,可以转换回double与C99 strtod( )功能,并且还与scanf( )功能。其他一些语言也支持这种格式。一些例子:

decimal number    %a format     meaning
--------------------------------------------
2.0               0x1.0p1       1.0 * 2^1
0.75              0x1.8p-1      1.5 * 2^-1

在十六进制格式具有优点,即所有的表示是确切。因此,将所述字符串返回到浮点将始终给出原始数目,即使有人改变其中执行转换的舍入模式。这不是为不精确的格式真。

如果你不希望使用无论什么原因,十六进制格式,并愿意承担该舍入模式将始终向最接近(默认值),那么你就可以格式化你的数据与小数逃脱至少17个显著数字。如果你有一个正确舍入的转换过程。(大多数 - 不是全部 - 平台做),这将保证你可以从双做一个来回串和背部没有任何精度损失

其他提示

听起来像你想的汉堡的算法(PDF):

  

在自由格式模式中的算法生成   要转换为最短正确舍入的输出字符串   在读回无论何时相同数量如何   四舍五入当读取器断开联系。

样本源代码(在C和方案)是可用的。

这是在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

在.NET框架有一个往返格式为这样:

string formatted = myDouble.ToString("r");

从文档:

  

在   往返符保证一个   数值转换成一个字符串   将被解析回相同   数值。当数值为   使用此符格式,它是   首先使用的一般格式测试   与精度15位的   双和7位的精度为   单。如果该值是成功   解析返回相同的数值,   它使用的是通用格式   格式说明。但是,如果   值未成功解析回   到相同的数值,则   值使用的17位格式   精度为一个双键和9位数字   精度为单个。

这个方法当然可以在大多数的任何语言来重新创建。

是的,是可以做到的,虽然实现依赖于语言。其基本思路是简单地以足够的精度将其打印出来。

请注意,反向是的真虽然:可精确地在小数被简单地表示的一些号码不能以二进制来表示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top