浮动到字符串和后面的无损转换:是否可能?

spr*_*aff 4 string floating-point floating-accuracy

此问题涉及C/x86上使用的IEEE标准浮点数.

是否可以将任何数字(即排除特殊值,如NaN)浮点数或双精度表示为十进制字符串,以便将该字符串转换回浮点数/双精度数将始终完全产生原始数字?

如果没有,什么算法告诉我给定的数字是否会出现转换错误?

如果是这样,请考虑这一点:当转换为二进制时,一些小数部分在数值上不会与原始十进制值相同,但反之则不正确(因为二进制具有有界精度,因此任何十进制扩展都是有限的,如果不是则完美截断),所以这是另一个问题......

是否有必要在十进制表示中引入故意错误以欺骗atof(或其他)函数产生确切的原始数字,或者一个天真的非截断toString函数是否足够(假设一般可以进行精确转换)?

Mys*_*ial 7

根据这个页面:

实际上,IEEE754-1985标准规定在所有情况下,17个十进制数字就足够了.但是,当使用17位数字时,标准实现是否必须保证无损转换似乎有点模糊.

因此,存储一个double至少包含17位数字(正确舍入)的十进制字符串将保证它可以转换回二进制double而不会丢失任何数据.

换句话说,如果要将每个可能的双精度值转换为17位数的十进制字符串(正确舍入),它们将全部映射到不同的值.因此没有数据丢失.


我不确定单精度的最小截止值.但我怀疑它会是8位或9位数.

  • 浮点数为 9 位(请参阅 http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF 第 4 页;另请参阅 Goldberg 的论文,“二进制到十进制转换”部分。) (3认同)