Что-то странное я заметил при сравнении boost :: lexical_cast и синтаксического анализа синтаксиса. Я пытаюсь разобрать строку в float. по какой-то причине дух дает очень неточный результат. например: при синтаксическом анализе строки «219721.03839999999», используя lexical_cast, я получаю 219721.03, который более или менее ОК. но когда я использую дух (см. код ниже), я получаю «219721.11», который далеко не в порядке. Любая идея, почему это происходит?Boost spirit floating number parser precision
template<>
inline float LexicalCastWithTag(const std::string& arg)
{
float result = 0;
if(arg.empty())
{
throw BadLexicalCast("Cannot convert from to std::string to float");
}
auto itBeg = arg.begin();
auto itEnd = arg.end();
if(!boost::spirit::qi::parse(itBeg, itEnd, boost::spirit::qi::float_, result) || itBeg != itEnd)
{
throw BadLexicalCast("Cannot convert from to std::string to float");
}
return result;
}
Чтобы быть более конкретным, lexical_cast дает правильный '219721.03125', который является ближайшим действительным' float' на '219721.03839999999', а' qi :: float_' дает вам '219721.109375', что действительно не кажется правильным. – Cubbi
Неотъемлемая часть номера почти насыщает емкость. То, как результат вычисляется в qi :: float_type :: parse(), таков, что «маленькие» ошибки возникают при добавлении каждого дробного числа. На самом деле это выглядит как ошибка, поскольку более умные алгоритмы не имеют этого субоптимального поведения. – sehe
как мы свяжемся с этой проблемой для поддерживающих дух? – kreuzerkrieg