Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 浮点到字符串和背面的无损转换:可能吗?_String_Floating Point_Floating Accuracy - Fatal编程技术网

String 浮点到字符串和背面的无损转换:可能吗?

String 浮点到字符串和背面的无损转换:可能吗?,string,floating-point,floating-accuracy,String,Floating Point,Floating Accuracy,这个问题是指在C/x86上使用的IEEE标准浮点数 是否可以将任何数字(即不包括NaN等特殊值)浮点数或双精度浮点数表示为十进制字符串,以便将该字符串转换回浮点数/双精度浮点数将始终精确生成原始数字 如果不是,什么算法告诉我给定的数字是否会发生转换错误 如果是的话,考虑一下:当十进制小数转换为二进制时,它的数值与原来的十进制值不一样,但反过来不是真的(因为二进制有界的精度,所以任何十进制扩展都是有限的,如果不截断的话,是完美的),所以这里还有另外一个问题… 为了欺骗atof(或其他)函数生成精确

这个问题是指在C/x86上使用的IEEE标准浮点数

是否可以将任何数字(即不包括NaN等特殊值)浮点数或双精度浮点数表示为十进制字符串,以便将该字符串转换回浮点数/双精度浮点数将始终精确生成原始数字

如果不是,什么算法告诉我给定的数字是否会发生转换错误

如果是的话,考虑一下:当十进制小数转换为二进制时,它的数值与原来的十进制值不一样,但反过来不是真的(因为二进制有界的精度,所以任何十进制扩展都是有限的,如果不截断的话,是完美的),所以这里还有另外一个问题…


为了欺骗
atof
(或其他)函数生成精确的原始数,是否有必要在十进制表示中引入故意错误,或者一个简单的、非截断的
toString
函数是否足够(假设通常可以进行精确转换)?

鉴于IEEE格式只能表示有限数量的(二进制)数字,因此具有最低精度(参见epsilon),您将只需要有限数量的(十进制)数字。当然,如果实现(
strtod
snprintf
)在{all float}和{one decimal representation for each float}集合之间具有身份映射行为,则更可取

事实上,IEEE754-1985标准规定17位小数是 在所有情况下都足够了。不过,这个标准似乎有点高 关于一致性实现是否必须保证无损的含糊不清 使用17位数字时的转换

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

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



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

在java中,通过构造中间的BigDecimal对象,可以将double从/转换为字符串:

double doubleValue = ...;

// From double to string
String valueOfDoubleAsString = new BigDecimal(doubleValue).toString();
// And back
double doubleValueFromString = new BigDecimal(valueOfDoubleAsString).doubleValue();

// doubleValue == doubleValueFromString
此方法不存在区域设置问题。
但是,特殊的双值(无限,NaN)当然不起作用。

什么语言/环境?从你提到的符号来看,它可以是JavaScript,也可以是C,或者完全是其他的东西。(本机
toString
几乎肯定不足以实现真正的无损往返)它是9位浮点数(参见第4页;另外,参见Goldberg的论文“二进制到十进制转换”一节)。您提到“正确舍入”。这不是一个漏洞吗?哪些实现通常不会或不能遵循?另外,实际实现是否符合这一理论保证?