- Формат чисел плавающей арифметики БК
-
? Дмитрий - 09.05.2010 13:08
Разбираюсь с сабжем - если бы пил, спился бы нафик. Как всегда в СССР делали не так как везде. Формат вроде бы совпадает с IEEE754 (http://www.vbstreets.ru/VB/Articles/66541.aspx), но только одинарной точности. Поясню на примере. Число "пи". Преобразованное из формата двойной точности оно выглядит так: 3,1415926535897932. Кодируется последовательностью из 4-х слов: &O40511, &O7732, &O121041, &O64302. Преобразуем в двоичный вид: &O40511 = &B0100000101001001, &O7732 = &B0000111111011010, &O121041 = &B1010001000100001, &O64302 = &B0110100011000010. Согласно IEEE754 в двоичном виде с разбивкой по полям оно выглядит так: 0 10000010 1001001000011111101101010100010001000010110100011000010. Для двойной точности в IEEE754 размер экспоненты выбран 11 бит. В БК что в одинарной точности, что в двойной размер 8 бит. Следовательно, размер мантиссы равен 55 бит. Значит формула по стандарту БК получается (-1)^S*2^(E-127)*(1+M/2^55). Знак S=0, экспонента &B10000010=130, мантисса &B1001001000011111101101010100010001000010110100011000010=20565104997263554. Считаем: -1^0*2^(130-127)*(1+20565104997263554/2^55)=1*8*1,5707963267948966=12,5663706143591729. Результат ровно 4*пи!!! Почему так получается - понять не могу. В тоже время описания форматов чисел с плавающей запятой от ДВК-4 совпадают с БКшными. Там приводится пример преобразования чисел. Число 3 с одинарной точностью представлено в виде 0 10000010 10000000000000000000000. Цитирую преобразование оттуда. "...Характеристика, трактуемая как целое число без знака, равна 2^7+2^1, т.е. 130, и значит порядок p=130-128=2. Мантисса с учетом "скрытого бита" M=2^-1+2^-2=0.75. Таким образом, код представляет число 2^p*M=3." В то время как по стандарту IEEE754 по формуле (-1)^S*2^(E-127)*(1+M/2^23) получается 12, т.е. опять-таки учетверенное значение. Если кто разбирается в этом - подскажите где правда? И как правильно преобразовывать числа из/в формат БК.
-
? anonymous - 10.05.2010 19:39
А что вам не нравится?
Знак у нас 0, значит получаем 1;
Порядок 10000010=130, вычитаем 128, возводим в полученное значение двойку, 2^(130-128)=4;
Мантиссу сперва восстанавливаем, добавляя подразумевающийся разряд, выходит 11001001000011111101101010100010001000010110100011000001, делим на 2^56, получаем 56593902016227521 / 72057594037927936 = 0.7853981633974482928772786749505, умножаем на порядок и получаем исходные 3.141592653589793171509114699802
-
? anonymous - 10.05.2010 19:49
Извиняюсь, битики последние два в мантиссе у меня местами изменены, если не *01, а *10 окончание, то π будет исходное, 3.1415926535897932270202659310598, а выше, начиная с 16 знака после запятой, у меня "уехало" значение.
-
? Александр Тишин (Sandro)@ - 10.05.2010 20:19
Дмитрий, по-вашему инженеры в СССР виноваты в неспособности знать будущее? Стандарт IEEE-754 был принят в 1985 году, то есть позже разработки процессора 1801ВМ1. Не говоря уже о том, что авторы этого формата -- фирма DEC. И придуман он был в те времена, когда единого стандарта на плавающую запятую ещё не было. Вспомнить только, какой ужас был в IBM 360/370 ...
По теме anonymous уже вам ответил, но скажу ещё проще: во-первых, в PDP-11 нулевая экспонента кодируется значением 128, а не 127, как в IEEE; во-вторых, старший бит мантиссы имеет вес 0.5, а не 1.0, то есть мантиссы находятся в диапазоне [0.5,1.0), а не [1.0,2.0). Вот тут-то два раза по 2 и набежало.
PS: IEEE-754 та ещё зараза. Стандарт, придуманный математиками. В железе крайне неудобно реализовывать. Приходилось иметь дело :(
-
? Дмитрий - 11.05.2010 00:03
2 anonymous: А почему на 2^56, ведь мантисса 55 бит?
-
? Александр Тишин (Sandro)@ - 11.05.2010 00:11
Потому что старший бит мантиссы имеет вес 0.5, а не 1.0
- << Форум