с плавающей точкой — преобразование C ++ из строки в длинную двойную теряет точность в QNX

При преобразовании строк в long double я теряю точность в QNX. Вы знаете, как решить эту проблему?

Я использую с ++. Я пробовал удваивать и плавать, и не было никаких проблем.

#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

Решение

Это связано с тем, что 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 составляет около 1е4931;
  • originalNumber - convertedNumber около 1е4925.

Это означает только первые 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";

Живая демо

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]