Как сгенерировать NaN, -Infinity и + Infinity в ANSI C?

Я использую ANSI C89 (не C ++) и хочу сгенерировать NaN, -Infinity и + Infinity.

Есть ли какой-либо стандартный способ (например, стандартный макрос)? Или существует какой-либо независимый от платформы и компилятора способ сгенерировать эти числа?

float f = 0.0 / 0.0; // Is f ALWAYS in any platform is NaN?
45
задан Sazzad Hissain Khan 28 December 2015 в 15:44
поделиться

1 ответ

Существует фактический способ создать бесконечность и отрицательную бесконечность. На основе стандарта IEEE 754, за которым следует C89, бесконечность определяется как число с плавающей точкой, содержащее весь 0s в мантиссе (первые 23 бита), и вся 1 с в экспоненте (следующие 8 битов). nan определяется как любое число со всей 1 с в экспоненте и чем-либо кроме всего 0s в мантиссе (потому что это - бесконечность). "Трудная" часть генерирует это число, но это может быть выполнено со следующим кодом:

unsigned int p = 0x7F800000; // 0xFF << 23
unsigned int n = 0xFF800000; // 0xFF8 << 20
unsigned int pnan = 0x7F800001; // or anything above this up to 0x7FFFFFFF
unsigned int nnan = 0xFF800001; // or anything above this up to 0xFFFFFFFF

float positiveInfinity = *(float *)&p;
float negativeInfinity = *(float *)&n;
float positiveNaN = *(float *)&pnan;
float negativeNaN = *(float *)&nnan;

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

0
ответ дан 26 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

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