В Visual Studio 2013, у меня есть следующий код теста:VS2013: strtof не устанавливает ERANGE?
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, const char* argv[])
{
static const char* floatStr = "3.40282346638528859811704183485E+39";
static const char* doubleStr = "1.79769313486231570814527423732E+309";
char* end;
float floatVal = 42.0f;
double doubleVal = 42.0;
errno = 0;
floatVal = strtof(floatStr, &end);
printf("Conversion of '%s':\nfloatVal=%f\nerrno='%s'\n",
floatStr,
floatVal,
strerror(errno));
errno = 0;
doubleVal = strtod(doubleStr, &end);
printf("Conversion of '%s':\ndoubleVal=%f\nerrno='%s'\n",
doubleStr,
doubleVal,
strerror(errno));
return 0;
}
Цель состоит в том, чтобы показать поведение наблюдается при использовании strtof() и strtod() функции на очень больших (перелив) входах.
То, что я нахожу, это то, что функция strtof() установит значение float в значение + INF, но не установит ERANGE errno. Функция strtod(), однако, устанавливает двойное значение до + INF и устанавливает ERANGE ERRNO:
Conversion of '3.40282346638528859811704183485E+39':
floatVal=1.#INF00
errno='No error'
Conversion of '1.79769313486231570814527423732E+309':
doubleVal=1.#INF00
errno='Result too large'
ожидается ли такое поведение, или это зависит от конкретной реализации нюанс?
Замечание: Мне кажется, что strtof() может вызывать strtod() и не устанавливать errno надлежащим образом после того, как приведение из double в float приведет к результату + INF?
MSVC 2015 дает * errno = 'Результат слишком большой * * в обоих случаях. Должна быть исправлена ошибка. –
Вы можете проверить, реализована ли ваша функция 'strtof' вызовом' strtod' путем анализа с помощью 'strtof' строки, такой как' '1.01161128282547". Когда это десятичное представление анализируется как «double» и округляется до ближайшего 'float', оно производит другой результат, чем если бы строка была проанализирована непосредственно как' float' («double rounding»). По этой причине функция strtof', выполненная таким образом, имеет низкое качество, даже если она правильно обрабатывает переполнения. Качество 'strtof' производит float' 1.01161134f'. Плохой 'strtof' производит' 1.01161122f'. –
@WeatherVane Я попытаюсь в VS2015, а затем отметьте ответ – Squirrel