我正在搜索函数以将字符串可靠地转换为双精度数然后再转换回c ++中的字符串,以便输出字符串与输入字符串完全相同。但即使经过数小时的搜索和尝试,我也找不到可靠的功能。
为了检查功能是否可靠,我进行了以下测试:
#include <iostream>
#include <string>
using namespace std;
string double2string(double value){
//...
}
double string2double(string value){
//...
}
int main(){
string strings[] = {
"111111111111110000",
"11111111111111000",
"1111111111111100",
"111111111111110",
"11111111111111",
"1111111111111.1",
"111111111111.11",
"11111111111.111",
"1111111111.1111",
"111111111.11111",
"11111111.111111",
"1111111.1111111",
"111111.11111111",
"11111.111111111",
"1111.1111111111",
"111.11111111111",
"11.111111111111",
"1.1111111111111",
"0.11111111111111",
"0.011111111111111",
"0.0011111111111111",
"0.00011111111111111"
};
double doubles[] = {
111111111111110000,
11111111111111000,
1111111111111100,
111111111111110,
11111111111111,
1111111111111.1,
111111111111.11,
11111111111.111,
1111111111.1111,
111111111.11111,
11111111.111111,
1111111.1111111,
111111.11111111,
11111.111111111,
1111.1111111111,
111.11111111111,
11.111111111111,
1.1111111111111,
0.11111111111111,
0.011111111111111,
0.0011111111111111,
0.00011111111111111
};
for(int i = 0; i < 22; i++){
cout
<< (string2double(strings[i])==doubles[i])
<< " "
<< (double2string(doubles[i])==strings[i])
<< endl;
}
return 0;
}
&#34;为什么要进行此测试?&#34;,您可能会问。让我解释: c ++ double有52位来保存整数。这个数字可以得到的最高值是2 ^ 52-1,或4503599627370495.这个数字是16位数。但是,由于并非所有16位长的数字都适合那些没有溢出的位,我的要求是可靠地仅转换所有15位数的数字。前导零或尾随零不计,因为它们可用11个指数位表示。
所以,基本上,我确保所有这些数字理论上都应该适合双重,没有任何溢出,这样我就可以将它们1:1转换回字符串。
现在:您是否知道有任何函数可以从double转换为字符串和返回,只有&#34; 1&#34; s打印出来才能完成测试?
答案 0 :(得分:1)
这基本上是不可能的。指定的方法太多了 文本格式为double,有关此格式的信息是 一旦你转换成双倍就失去了。例如,在我的机器上 所有以下字符串都转换为相同的double:
1
1.0
1e0
1.000000000000000000001
+1.0
0001.0
还有更多。一旦你这个信息被彻底丢失了 有双倍。
如果您将输入限制为特定格式,请说科学 总共15位数字,然后是15位数字 如果您的机器使用IEEE,则应正确往返。