2012-02-04 2 views
2

Мне очень интересно, как хранится число с плавающей точкой с двойной точностью.Как хранится и вычисляется число с плавающей запятой двойной точности?

Это вещи, которые я догадался до сих пор.

  1. Они требуют 64 бита в памяти
  2. Состоит из трех частей
    • Знаковый бит (1 бит в длину)
    • экспонент (11 бит в длину)
    • фракции (53 бита, первый бит считается всегда равным 1, поэтому сохраняются только 52, за исключением случаев, когда все 52 бита равны 0. Тогда старший бит считается 0)

Однако я не uderstand, что показатель, смещение показателя степени и все эти формулы в wikipedia page.

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

+0

Возможный дубликат http://stackoverflow.com/questions/6535343/c-how-is-double-number-eg-123-45-stored-in-a-float-variable-or-double-vari Посмотрите на лучшее ответ. Это то же самое, но с большим количеством бит для мантиссы и экспоненты. – Ram

+0

Возможный дубликат [Почему одноточечный поплавок IEEE754 имеет только 7-значную точность?] (Http://stackoverflow.com/questions/19130396/why-ieee754-single-precision-float-has-only-7-digit-precision) Ответ и первый комментарий объясняют все кратко – Ron

+0

Как работает IEEE754 и как вычисляется «реальное число» (точности) - это два разных вопроса. Я бы посоветовал вам начать с изучения того, как работает плавающая точка IEEE754, а затем посмотрите на связанный выше вопрос – Ron

ответ

2

Заканчивать формулу немного дальше вниз страницы:

за выше исключениями, весь двойной точностью описывается:

(-1)^знаком * 2^(экспоненты - смещение) * 1.mantissa

Формула означает, что для не-NAN, non-INF, ненулевых и недеревальных чисел (которые я проигнорирую) вы берете бит в мантиссе и добавляете неявные 1 бит вверху. Это делает mantissa 53 бит в диапазоне 1.0 ... 1.111111 ... 11 (двоичный). Чтобы получить фактическое значение, вы умножаете мантиссу на 2 по степени экспоненты за вычетом смещения (1023) и либо отрицаете результат, либо нет в зависимости от знакового бита. Число 1.0 будет иметь несмещенный показатель нуля (т. Е. 1.0 = 1.0 * 2^0), а его предвзятый показатель будет 1023 (смещение просто добавляется к экспоненте). Итак, 1.0 будет sign = 1, exponent = 1023, mantissa = 0 (помните бит скрытой мантиссы).

Объединяя все в шестнадцатеричном виде, значение будет 0x3FF000000000 == 1.0.

0
  • Вход: 1, если отрицательный 0, если положительный
  • Фракция: Инженеринг плавающей rappresentation в двоичном режиме.
  • Показатель: показатель e такой, что fraction * 2^e равно числу, которое я хочу выразить.
  • Предвзятость - это число, которое должно быть вычтено экспоненте для правильного представления. В двойной точности составляет 1023, с одинарной точностью 127.

пример (с одинарной точностью Couse более удобно для меня, чтобы написать =)): , если я должен был rappresent -0.75 я сделать: - двоичный rappresentation будет -11 * 2^-2 = -1.1 * 2^-1

  • знак = 1
  • фракция = 1 + 0,1000 ....
  • необъективным показатель: -1 + 127 = 126 -> 01111110

поэтому мы должны были -0.75 = 1 01111110 10000000000000000000000

На сумму вы должны выровнять показатель, а затем вы можете суммировать fracional часть.

Для умножения нужно

  • суммы экспоненту и subracting Уклона
  • multuply дробной части
  • округление результата
  • взгляда на знак (если у вас есть такие же знак, так что знак = 0 else sign = 1)
0
int main() 
    { 
     double num = 5643.0662; 
     int sign = 0; 
     int exponent = 1035; 
     int exponent_bias = 1023; 
     float mantissa = 0.0662; 

      double x = pow(-1,sign) * pow(2,(exponent - exponent_bias)) * (1+mantissa); 
     int y = num - x; 

     cout << "\nValue of x is : " << x << endl; 
     cout << "\nValue of y is : " << y << endl; 

     return 0; 
    } 
+1

@please, если в этом коде есть ошибка, и вы хотите исправить это, пожалуйста, заполните и исправьте это. –

Смежные вопросы