C ++从字符串转换为长双精度会丢失QNX中的精度

时间:2018-12-28 12:17:20

标签: c++ floating-point qnx qnx-neutrino

将字符串转换为long double时,我在QNX中失去了精度。你知道如何解决这个问题吗?

我正在使用c ++。我试过两次和浮动,没有问题。

#include <iostream>
#include <string>
#include <limits>
#include <sstream>

int main(){
    long double originalNumber = std::numeric_limits<long double>::max() / 2;
    long double convertedNumber;

    // From long double to string
    std::ostringstream ostr;
    ostr << originalNumber;
    std::string tmp_str = ostr.str();

    //From string to long double
    std::istringstream istr(tmp_str);
    istr >> convertedNumber;

    // Check if they are similar
    if (originalNumber == convertedNumber)
        std::cout<< "The same\n";
    else
        std::cout<< "Not the same\n";

    return 0;
}

结果始终为Not the same

1 个答案:

答案 0 :(得分:3)

这是因为ostr << originalNumber;对浮点数使用默认格式,这是对大数字的科学提示。

#include <iostream>
#include <limits>

int main()
{
    long double const originalNumber = std::numeric_limits<long double>::max() / 2;
    std::cout << originalNumber << '\n'; // 5.94866e+4931
}

Live demo

当您将该表示解析回浮点数时,以下所有数字都会丢失。实际上,如果您查看数量级:

  • originalNumber约为1e4931;
  • originalNumber - convertedNumber大约是1e4925。

这意味着originalNumber的前6位(4931-4925)是正确的;如果您使用科学记数法,这是有道理的。

解决方法是std::fixed,如SO问题"How do I print a double value with full precision using cout?"所述:

ostr << std::fixed << originalNumber;
// ...
if (originalNumber == convertedNumber) // true
    std::cout<< "The same\n";
else
    std::cout<< "Not the same\n";

Live demo

请注意,floatting-point mathematic can appear to be broken并将两个浮点数与==进行比较通常不是一个好选择。