Floating point IEEE的精确文本表示法;“双”字;

Floating point IEEE的精确文本表示法;“双”字;,floating-point,floating-accuracy,ieee-754,Floating Point,Floating Accuracy,Ieee 754,我需要以人类可读的文本形式表示IEEE 754-1985双(64位)浮点数,条件是可以将文本形式解析回完全相同的(位)数 在不打印原始字节的情况下,这是否可行? 如果是,请使用代码执行此操作。最佳选项:使用C99十六进制浮点格式: printf("%a", someDouble); 通过C99strtod()函数以及scanf()函数,可以将以这种方式生成的字符串转换回double。其他几种语言也支持这种格式。一些例子: decimal number %a format mean

我需要以人类可读的文本形式表示IEEE 754-1985双(64位)浮点数,条件是可以将文本形式解析回完全相同的(位)数

在不打印原始字节的情况下,这是否可行?
如果是,请使用代码执行此操作。

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

printf("%a", someDouble);
通过C99
strtod()
函数以及
scanf()
函数,可以将以这种方式生成的字符串转换回
double
。其他几种语言也支持这种格式。一些例子:

decimal number    %a format     meaning
--------------------------------------------
2.0               0x1.0p1       1.0 * 2^1
0.75              0x1.8p-1      1.5 * 2^-1
十六进制格式的优点是所有表示都是精确的。因此,将字符串转换回浮点值将始终给出原始数字,即使有人更改了执行转换的舍入模式。对于不精确的格式,情况并非如此


如果出于任何原因不想使用十六进制格式,并且愿意假设舍入模式总是四舍五入到最接近的(默认设置),那么可以将数据格式化为至少有17位有效数字的小数。如果您有一个正确的四舍五入转换例程(大多数——不是所有——平台都有),这将保证您可以在不损失任何准确性的情况下完成从double到string再到back的往返过程。

是的,可以完成,尽管实现取决于语言。其基本思想就是以足够的精度将其打印出来


请注意,相反的情况并非如此:一些可以用十进制精确表示的数字不能用二进制表示。

对于这一点,.NET framework有一种往返格式:

string formatted = myDouble.ToString("r");
从文件中:

往返说明符保证 转换为字符串的数值 将被解析回相同的 数值。当数值为 使用此说明符格式化,它是 首先使用通用格式进行测试, 具有15个空格的精度 a的精度为双精度和7个空格 单身。如果该值成功 解析回相同的数值, 它是使用通用的 格式说明符。然而,如果 值未成功解析回 设置为相同的数值,然后 值的格式为17位数字 双精度和9位数字的精度 单精度

当然,这种方法可以用大多数任何语言重新创建。

听起来像你想要的(PDF):

在自由格式模式下,算法生成 转换为的最短正确舍入输出字符串 无论 四舍五入时读卡器会断开连接

(在C和Scheme中)也可用

这是Python3.x中使用的算法,用于确保
float
s可以转换为字符串并返回,而不会损失任何准确性。在Python2.x中,
float
s始终用17位有效数字表示,因为:

repr(float)
产生17个有效数字,因为这足够了(在大多数机器上),所以
eval(repr(x))==x
对于所有有限的float
x
,但四舍五入到16个数字不足以实现这一点。 (来源:)


语言很重要。你用什么语言工作?在问题中没有提到特定的语言是不可能提供代码的。我没有提到语言(D),因为它比较罕见,所以我计划将用任何语言编写的算法重写为D。NaN,-0.0,inf,-inf呢?目前的答案似乎没有考虑到这些。谢谢你提供了非常详细的答案!