Вопрос касательно IEEE 754, 64 бит, двойной? - PullRequest
3 голосов
/ 25 февраля 2011

Пожалуйста, обратите внимание на следующее содержание:

enter image description here

Я понимаю, как преобразовать double в двоичный файл на основе IEEE 754. Но я не понимаю, для чего используется формула.

Может ли кто-нибудь дать мне пример использования вышеприведенной формулы, пожалуйста?

Большое спасибо.

Ответы [ 2 ]

7 голосов
/ 25 февраля 2011

Формула, которая выделена красным цветом, может использоваться для вычисления действительного числа , которое представляет 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. Число 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 является точно представимым.

  2. Число 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 не является точно представимым.

2 голосов
/ 25 февраля 2011

Формула состоит в том, чтобы преобразовать двоичное представление в число!

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

...