Вычислить epsilon для поплавка в C

Вопрос:

Я должен использовать операции бит/целое число, чтобы вычислить epsilon для заданного значения в C. Я знаю в терминах битовых шаблонов, что вычисление следующего соседа включает в себя увеличение мантиссы, и если это переполнение, чтобы увеличить показатель экспоненты, но я ‘ m не уверен, с чего начать с точки зрения вычисления эпсилона.

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

Здесь мое понимание (основанное на некоторых исследованиях, которые я сделал здесь на SO): диапазон меняется, очевидно, по мере увеличения числа, но я не уверен, как использовать FLT_EPSILON для генерации правильных чисел. Для чисел 2 ^ 2x, возможно, это (FLT_EPSILON - 1) * number?

Лучший ответ:

Если ваш эпсилон – это просто значение одного приращения LSB для мантиссы, значение должно быть 2 ^ (exp -23). Поэтому, если ваш вход [s][exp][mantissa] ваш epsilon должен быть [0][exp-23][0]. Разумеется, при вводе 1,0 ([0][127][0]) результат будет [0][104][0]= 2 ^ -23 = FLT_EPSILON.

Ответ №1

из-за формата IEEE 754 вам нужно 1 в мантиссе, а 127 – в 23

float x;

*((int*) &x) = 1;
*((int*) &x) = *((int*) &x) | 104 << 23;

printf("%.12f\n", FLT_EPSILON);
printf("%.12f\n", x);

Оцените статью
TechArks.Ru
Добавить комментарий