C ++, преобразовывающий из строки в long double, теряет точность в QNX - PullRequest
0 голосов
/ 28 декабря 2018

При преобразовании строк в 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 голосов
/ 28 декабря 2018

Это связано с тем, что 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
}

Демонстрационная версия

Когда вы анализируете это представление обратно в число с плавающей запятой, все следующие цифры теряются.На самом деле, если вы посмотрите на порядки:

  • originalNumber составляет около 1e4931;
  • originalNumber - convertedNumber составляет около 1e4925.

Это означает, что только первые 6 (4931-4925) цифр originalNumber являются правильными;что имеет смысл, если вы используете научную нотацию.

Решение - std::fixed, как указано в вопросе SO "Как вывести двойное значение с полной точностью, используя cout? ":

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

Демонстрационная версия

Осторожно, хотя математика с плавающей точкой может показаться неверной и сравнение двухЧисла с плавающей точкой с == часто не являются хорошим выбором.

...