gpt4 book ai didi

c++ - 可靠地将字符串转换为 double 并返回

转载 作者:行者123 更新时间:2023-11-28 06:36:58 24 4
gpt4 key购买 nike

我一直在寻找能够可靠地将字符串转换为 double 然后再转换回 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;
}

“为什么要做这个测试?”,您可能会问。让我解释:C++ double 有 52 位来保存一个整数。这个数最多能得到2^52-1,即4503599627370495。这个数有16位长。但由于并非所有 16 位长的数字都适合这些位而不会溢出,因此我的要求是仅可靠地转换所有 15 位长的数字。前导零或尾随零不算在内,因为它们可以用 11 个指数位表示。

所以,基本上,我确保所有这些数字在理论上应该适合 double ,没有任何溢出,这样我就可以将它们 1:1 转换回字符串。

现在:您是否知道任何将 double 转换为字符串并返回的函数,这些函数可以仅打印出“1”来完成测试?

最佳答案

这基本上是不可能的。指定方式太多文本格式的 double 值,有关此格式的信息是一旦你转换成双倍丢失。例如,在我的机器上,以下所有字符串都转换为相同的 double :

1
1.0
1e0
1.000000000000000000001
+1.0
0001.0

还有更多。一旦你这样做,这些信息肯定会丢失有双。

如果您将输入限制为特定格式,比如科学总共有 15 位数字,然后是最多 15 位数字如果您的机器使用 IEEE,应该可以正确往返。

关于c++ - 可靠地将字符串转换为 double 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com