VS2013: strtof не устанавливает ERANGE?
В Visual Studio 2013 у меня есть следующий тестовый код:
#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 () устанавливает значение с плавающей запятой на +INF, но не устанавливает ERRGE 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?
1 ответ
Решение
Как указал WeatherVane, в VS2015 этого не происходит и, по-видимому, это ошибка в реализации VS2013.