可靠的将字符串转换为双精度和后退

时间:2014-10-29 13:53:39

标签: c++ string double string-parsing

我正在搜索函数以将字符串可靠地转换为双精度数然后再转换回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打印出来才能完成测试?

1 个答案:

答案 0 :(得分:1)

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

1
1.0
1e0
1.000000000000000000001
+1.0
0001.0

还有更多。一旦你这个信息被彻底丢失了 有双倍。

如果您将输入限制为特定格式,请说科学 总共15位数字,然后是15位数字 如果您的机器使用IEEE,则​​应正确往返。