【问题标题】:C++ converting from string to long double loses precision in QNX从字符串转换为长双精度的 C++ 在 QNX 中失去了精度
【发布时间】:2019-05-26 06:38:47
【问题描述】:

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

我正在使用 C++。我试过 double 和 float 都没有问题。

#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

【问题讨论】:

  • 您需要use std::setprecision 才能实际输出足够的精度,以期获得完全可重现的值。也就是说,在可表示的doubles 的边界附近,如果仍有一些损失,我不会感到惊讶。

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


【解决方案1】:

这是因为 ostr &lt;&lt; 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 并将两个浮点数与 == 进行比较通常不是一个好的选择。

【讨论】:

  • 感谢您的详细解释,但我仍然有问题:\ 我使用的是 QNX 而不是 Linux。
  • @H.Ilyas CNR.
  • 我在 QNX 上使用 QCC 而不是 g++。
  • @H.Ilyas 打印您的号码并调试您的程序。我手头只有一个 linux 和 gcc/clang。
  • 这行代码就是问题istr &gt;&gt; convertedNumber;。我可以将std:fixed 与>> 运算符一起使用吗?
猜你喜欢
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多