Включите boost::lexical_cast для исключения ошибки из диапазона для значений, меньших двойного диапазона
boost::lexical_cast
выдает ошибки для значений, превышающих максимальное значение double. Но для чисел, меньших, чем минимальное значение, он молча обнуляет его. Как включить ошибки вне диапазона для более позднего случая (т. Е. Если число меньше, чем 2.22507e-308, то парсер должен выдать некоторую ошибку)?
#include <iostream>
#include <limits>
#include <boost/lexical_cast.hpp>
int main()
{
std::cout<<boost::lexical_cast<long double>("1.5787658476e-400")<<'\n';
std::cout<<boost::lexical_cast<double>("1.5787658476e-400")<<'\n';
std::cout<<std::numeric_limits<double>::min()<<'\n';
try{
std::cout<<boost::lexical_cast<double>("1.5787658476e+400")<<'\n';
} catch(boost::bad_lexical_cast &e)
{
std::cout<<e.what()<<'\n';
}
std::cout<<std::numeric_limits<double>::max()<<'\n';
return 0;
}
1 ответ
Решение
Я думаю, что это ожидаемое поведение.
Вы можете проверить, точно ли количество кругов Но в общем случае десятичные представления не соответствуют точно двоичному представлению, так что это будет сложно и невозможно сделать правильно в общем случае (где допустим любой десятичный ввод).
Вы могли бы добиться большей безопасности в обоих направлениях, используя тип десятичного числа, например: boost::multiprecision::cpp_dec_float
,