Согласно cppreference.com, вот что происходит:
(5) извлекает значение с плавающей запятой, вызывая std::num_get::get()
Этап 3: преобразование и хранение
Входные данные анализируются как если бы std::strtof
В любом случае при сбое функции преобразования std::ios_base::failbit
присваивается err
.
Возвращаемое значение
Значение с плавающей запятой, соответствующее содержимому строки в случае успеха.Если преобразованное значение выходит за пределы диапазона соответствующего типа возврата, возникает ошибка диапазона и возвращается HUGE_VAL
, HUGE_VALF
или HUGE_VALL
.Если преобразование не может быть выполнено, возвращается 0 и *str_end
устанавливается на str
.
HUGE_VALF
Расширяется до положительного выражения с плавающей запятой, которое указывает на переполнение
В вашем случае ясно, что std::strtof
с 5.94...e+4931
переполнит float
, оно должно вернуть HUGE_VALF
, что является значением ошибки для этой функции.Под linux:
float const have_overflown = std::strtof("1e307", nullptr);
std::cout << "equals HUGE_VALF: " << std::boolalpha
<< (have_overflown == HUGE_VALF) << '\n'; // true
std::cout << "string repr: " << have_overflown << '\n'; // inf
Демонстрация в реальном времени
Поскольку std::strtof
эффективно возвращает HUGE_VALF
для переполненных значений, бит сбоя потока, вызывающего его , должен будет установлено, как указано в спецификации std::istringstream::operator<<(float&)
.
QNX не соответствует этому требованию.Вы можете попытаться проверить, где в цепи произойдет сбой.
В соответствии с QNX doc на strtof
:
Если правильное значение будетвызвать переполнение, плюс или минус HUGE_VAL возвращается в соответствии со знаком, и errno устанавливается в ERANGE.
Вы можете проверить errno
против ERANGE
в дополнение к проверке битов сбоя потока:
errno = 0;
iss >> floatNumber;
if (iss.fail() || errno == ERANGE) {
// fail
}
Наконец, если ваша реализация не соответствует своей собственной документации, как вы говорите, id делает это в разделе комментариев, вы можете проверить floatNumber
против HUGE_VALF
, чтобы обнаружить переполнения.