一个IEEE的确切文字表述“双规”
-
21-09-2019 - |
题
我需要表示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用于确保float
s可以转换为字符串和背面不准确性的任何损失的算法。在Python 2.x中,float
s总是与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位数字 精度为单个。
这个方法当然可以在大多数的任何语言来重新创建。
是的,是可以做到的,虽然实现依赖于语言。其基本思路是简单地以足够的精度将其打印出来。
请注意,反向是不的真虽然:可精确地在小数被简单地表示的一些号码不能以二进制来表示