Формула, которая выделена красным цветом, может использоваться для вычисления действительного числа , которое представляет 64-битное значение, когда рассматривается как двойной IEEE 754.Это полезно только в том случае, если вы хотите вручную вычислить преобразование двоичного числа в действительное число в base-10, которое оно представляет, например, при проверке правильности реализации библиотеки C printf
.
Например, используяформула для 0x3fd5555555555555
, x точно равна 0,333333333333333314829616256247390992939472198486328125.Это действительное число, которое представляет 0x3fd5555555555555
.
#include <stdio.h>
#include <stdlib.h>
int main()
{
union {
double d;
unsigned long long ull;
} u;
u.ull = 0x3fd5555555555555L;
printf("%.55f\n", u.d);
return EXIT_SUCCESS;
}
http://codepad.org/kSithgZQ
РЕДАКТИРОВАТЬ: Как прокомментировал Олоф, двойной IEEE 754 в точности представляет значение x в уравнении, но не все действительные числа точно представимы.На самом деле, только конечное число вещественных чисел, таких как 0,5, 0,125 и 0,333333333333333314829616256247390992939472198486328125 , являются точно представимыми, в то время как подавляющее большинство ( неисчислимо много ), включая 1/3, 0,1, 0,4,и π не являются .
Ключом к знанию, является ли вещественное представление точно представимым в виде двойного IEEE 754, является вычисление двоичного представления действительного числа и запись егов научная запись (например, b1,001 × 2 -1 для 0,5625).Если число двоичных цифр справа от десятичной точки, исключая конечные нули, меньше или равно 52, а показатель минус единица находится в диапазоне от -1022 до +1023 включительно, то число является точно представимым.
Давайте рассмотрим пару примеров.Обратите внимание, что это помогает иметь калькулятор произвольной точности под рукой.Я буду использовать ARIBAS .
Число 1/64 составляет 0,015625 в десятичном виде.Чтобы вычислить его двоичное представление, мы можем использовать функцию ARIBAS 'decode_float
:
==> set_floatprec(double_float).
-: 64
==> 1/64.
-: 0.0156250000000000000
==> set_printbase(2).
-: 0y10
==> decode_float(1/64).
-: (0y10000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000,
-0y1000101)
==> set_printbase(10).
-: 10
==> -0y1000101.
-: -69
Таким образом, 1/64 = b0.000001 или b1.0 × 2 -6 в научнойнотация.
1/64 является точно представимым.
Число 1/10 = 0,1 в десятичном виде.Чтобы вычислить его двоичное представление:
==> set_printbase(2).
-: 0y10
==> decode_float(1/10).
-: (0y11001100_11001100_11001100_11001100_11001100_11001100_11001100_11001100,
-0y1000011)
==> set_printbase(10).
-: 10
==> -0y1000011.
-: -67
Итак, 1/10 = 0.1 = b0.000 1100 (где полужирный представляет последовательность повторяющихся цифр), или b1.100 1100 × 2 -4 в научной записи.
1/10 не является точно представимым.