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

Я использую MSVC ++, и я хочу использовать специальную БЕСКОНЕЧНОСТЬ значения в своем коде.

Каков шаблон байта или постоянный для использования в 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

}
8
задан Jon Seigel 13 April 2010 в 00:53
поделиться

5 ответов

Используйте numeric_limits :

#include <limits>

float maxFloat = std::numeric_limits<float>::infinity();
20
ответ дан 5 December 2019 в 04:55
поделиться

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

2
ответ дан 5 December 2019 в 04:55
поделиться

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

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

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

11
ответ дан 5 December 2019 в 04:55
поделиться

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

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

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

float inf = std::numeric_limits<float>::infinity().
2
ответ дан 5 December 2019 в 04:55
поделиться

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

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

3
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: