lexical_cast strtof strtold потерять точность?

Вот:

#include <iostream>
#include <cstdlib>
#include <boost/lexical_cast.hpp>

int main(void) {
    const char * str = "277499.84";

    std::cout << boost::lexical_cast<double>(str) << std::endl;
    std::cout << strtof(str, NULL) << std::endl;
    std::cout << strtold(str, NULL) << std::endl;
    std::cout << atof(str) << std::endl;

    return 0;
}

выход:

277500
277500
277500
277500

Почему на выходе нет 277499,84?

1 ответ

Решение

Это не сами операции, теряющие точность, а результат.

Вы можете использовать манипулятор ввода-вывода std::setprecision контролировать числовую точность. Следующее будет использовать полную точность удвоения (при условии, что поток установлен для десятичного вывода).

double value = boost::lexical_cast<double>(str);
std::cout << std::setprecision( std::numeric_limits<double>::digits10 + 1 ) << value;

Или вы можете использовать std::ios_base::precision, Это полезно, если вы хотите восстановить точность до исходного значения после.

auto old_precision = cout.precision( std::numeric_limits<double>::digits10 + 1 );
cout << value;
cout.precision( old_precision );
Другие вопросы по тегам