Бесконечность в MSVC ++ - PullRequest
       33

Бесконечность в MSVC ++

8 голосов
/ 29 марта 2010

Я использую MSVC ++ и хочу использовать в своем коде специальное значение INFINITY.

Какой байтовый шаблон или константу использовать в MSVC ++ для бесконечности?

Почему 1.0f / 0.0f имеет значение 0?

#include <stdio.h>
#include <limits.h>

int main()
{
  float zero = 0.0f ;
  float inf = 1.0f/zero ;

  printf( "%f\n", inf ) ; // 1.#INF00
  printf( "%x\n", inf ) ; // why is this 0?

  printf( "%f\n", zero ) ; // 0.000000
  printf( "%x\n", zero ) ; // 0

}

Ответы [ 5 ]

20 голосов
/ 29 марта 2010

Использование numeric_limits:

#include <limits>

float maxFloat = std::numeric_limits<float>::infinity();
11 голосов
/ 29 марта 2010

printf("%x\n", inf) ожидает целое число (32 бита в MSVC), но получает двойное число. Веселье наступит. Я имею в виду: неопределенное поведение.

(И да, он получает удвоение, поскольку для списка переменных аргументов число с плавающей запятой увеличивается до двойного).

В любом случае отредактируйте, вы должны использовать numeric_limits, как и в другом ответе.

3 голосов
/ 14 апреля 2010

В списке аргументов переменной для printf значения с плавающей точкой повышаются до двойных. Представление бесконечности байтов в бесконечности в виде двойного числа равно 00 00 00 00 00 00 F0 7F.

Как упоминал Петерчен, "% x" ожидает int, а не double. Таким образом, printf просматривает только первые байты аргумента sizeof (int). Ни одна версия MSVC ++ не определяет, что int больше 4 байт, поэтому вы получаете все нули.

2 голосов
/ 29 марта 2010

Вот что происходит, когда вы врете printf (), это неправильно. Когда вы используете спецификатор формата% x, он ожидает, что в стеке будет передано целое число, а не число, переданное в стек FPU. Исправлено:

printf( "%x\n", *(__int32*)&inf ) ;

Вы можете получить бесконечность из заголовочного файла <limits> C ++:

float inf = std::numeric_limits<float>::infinity().
2 голосов
/ 29 марта 2010

Взгляните на numeric_limits::infinity.

...