Я использую 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
}
Используйте numeric_limits
:
#include <limits>
float maxFloat = std::numeric_limits<float>::infinity();
printf ("% x \ n", inf)
ожидает целое число (32 бита в MSVC), но получает двойное . Веселье начнется. Эээ, я имею в виду: неопределенное поведение.
(И да, он получает удвоение, поскольку для списка переменных аргументов число с плавающей запятой повышается до удвоения).
В любом случае редактируйте, вы должны использовать numeric_limits
, как сказано в другом ответе.
Вот что происходит, когда вы лжете printf (), она ошибается. Когда вы используете спецификатор формата% x, он ожидает, что в стек будет передано целое число, а не число с плавающей запятой, переданное в стек FPU. Исправление:
printf( "%x\n", *(__int32*)&inf ) ;
Вы можете получить бесконечность из
заголовочного файла C ++:
float inf = std::numeric_limits<float>::infinity().
В списке аргументов переменных для printf числа с плавающей запятой повышаются до удвоения. Байтное представление бесконечности в виде числа типа double с прямым порядком байтов - это 00 00 00 00 00 00 F0 7F.
Как упоминал Петерхен, «% x» ожидает int, а не double. Таким образом, printf смотрит только на первые байты sizeof (int) аргумента. Ни одна из версий MSVC ++ не определяет, что длина int превышает 4 байта, поэтому вы получаете все нули.