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.

Другие вопросы по тегам