February 4th, 2010

Машинная арифметика

Не программерам не читать. Реально не интересно.

Итак, вопрос. Я думаю, что к Жене, потому что из остальных знакомых 6 прогаммеров на него не ответил никто даже с википедией. Т.е. никто не понимает машинную арифметику. И мне стало интересно, потому что я видимо тоже не понимаю.

Есть Double. 64битный. Это в яве. В С++ это называется long double вроде.
И работают они с ним одинаково, согласно IEEE754.

Как в Double представляется число 2 (по битам)?

Алгоритм перевода: http://www.sgu.ru/prcnit/teach/3.php
В принципе, везде одинаково пишут.
В скобочках указываю систему счисления (2) -- двоичная, (10) --
десятичная. ^ -- степень. 10^2 -- 10 во второй.
Че делаем по нему:
1) 2 = 2.0 (10)
2) 2.0 == 10.000...0 (2)
3) Нормализуем: 10.00000...0 = 1.000000...000*10^1
4) Берем смещение экспоненты, оно равно: 1023 для 64битного дабла.
Порядок у нас = 1. Значит смещеннный порядок: 1023+1 = 1024 (10).
1024(10) = 1000000000 (2) 11 знаков, ед. и 10 нулей.
первый разряд это знак. у нас там должен быть 0.
11 следующих -- экспонента == 10000000000 (2)
И остальные 52 -- мантисса. Т.к. мантисса всегда начинается с 1, машина это уже знает и отбрасывает ее, т.е. должно получится в итоге:
01000....000
Однако
Double x = 2;
System.out.println("x(2) == " + Double.toLongBits(x));
выдает:
10000....000.
Почему?