сортировка — Создание значения с плавающей точкой NaN из частей знака, экспоненты и мантиссы в переполнении стека

Мне нужно создать переменную с плавающей точкой в ​​C ++, которая имеет значение NaN. Мне также нужно иметь возможность увидеть, какой NaN имеет большее значение. Чтобы сравнить NaN, вам нужно посмотреть на часть мантиссы поплавка.
Создание NaN с использованием стандарта

nanf("abc");

метод дает NaN с одной и той же мантиссой, даже с разными строками, используемыми в функции nanf. Создавая NaN из базовых частей битового шаблона, следует обеспечить различные мантиссы, и поэтому можно выполнить простую сортировку по размеру мантиссы.

1

Решение

Взгляни на frexp() семейство функций, а также ldexp()что-то вроде противоположности frexp()

Ссылка на сайт: http://www.cplusplus.com/reference/cmath/ldexp/

1

Другие решения

Вот пример определения типов с плавающей запятой с объединениями и целочисленными битовыми полями.

#include <iostream>

union floatPun {
struct {
unsigned int mantissa : 23;
unsigned int exponent : 8;
unsigned int sign     : 1;
};
float value;
};

union doublePun {
struct {
unsigned long long mantissa : 52;
unsigned long long exponent : 11;
unsigned long long sign     : 1;
};
float value;
};

template <typename PunT>
static int compare_mantissas(const PunT& a, const PunT& b) {
return int(a.mantissa > b.mantissa) - (b.mantissa > a.mantissa);
}

int main() {
floatPun fa = {0}, fb = {0};

// make NaNs
fa.exponent = fb.exponent = 0xff;
fa.mantissa = 1;
fb.mantissa = 2;
std::cout << "fa: " << fa.value << "   fb: " << fb.value << "\n";

// compare mantissas
static const char* const cmp_labels[] = {"less than", "equal to", "greater than"};
std::cout << "mantissa of fa is "<< cmp_labels[1 + compare_mantissas(fa, fb)]
<< " mantissa of fb\n";

// change fa to +infinity
fa.mantissa = 0;
std::cout << "changed fa's mantissa to zero: " << fa.value << "\n";
}
0

По вопросам рекламы [email protected]