Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

въпрос за плаваща запетая
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=8039
Страница 1 от 1

Автор:  uglyduck [ Сря Авг 11, 2010 12:46 pm ]
Заглавие:  въпрос за плаваща запетая

Искам да попитам относно смятането на числа с плаваща запетая, че не ми стана ясно нещо.
Чета IEEE 754-1985 и почвам да проигравам примера в "Single-precision 32-bit" секцията - числото е:
0 _ 01111100 _ 0100000000000000000000 (знаков бит _ 8-бит експонента _ 23-битова мантиса)

Според формулата
V = (-1)^s * 2^(exponent - 127) * (1+fraction)

би трябвало да се получи
1 * 2^(-3) * 1,25 = 0,15625

Е, тъп съм и се чудя в какъв формат е представена мантисата - прав код, обратен, допълнителен... Със сигурност са прави, но все пак, как от 1.01 (двоично) се получава 1.25 (десетично)? Това ме обърква.

Автор:  tgi [ Сря Авг 11, 2010 1:18 pm ]
Заглавие: 

Мантисата е най-обикновено двоично число. Избутана е наляво докато удари
с единица в експонента _и още веднъж_, т.е. най-старшият бит на мантисата
е винаги по подразбиране 1 и е извън 23-те бита, които се пишат.
Изключение правят т.нар. "tiny" числа, при които експонентът е 0, тогава
мантисата просто е двоично число без избутване наникъде и без подразбираща
се невписана най-старша 1-ца.

Автор:  tntpcb [ Сря Авг 11, 2010 1:31 pm ]
Заглавие:  Re: въпрос за плаваща запетая

uglyduck написа:
Искам да попитам относно смятането на числа с плаваща запетая, че не ми стана ясно нещо.
Чета IEEE 754-1985 и почвам да проигравам примера в "Single-precision 32-bit" секцията - числото е:
0 _ 01111100 _ 0100000000000000000000 (знаков бит _ 8-бит експонента _ 23-битова мантиса)

Според формулата
V = (-1)^s * 2^(exponent - 127) * (1+fraction)

би трябвало да се получи
1 * 2^(-3) * 1,25 = 0,15625

Е, тъп съм и се чудя в какъв формат е представена мантисата - прав код, обратен, допълнителен... Със сигурност са прави, но все пак, как от 1.01 (двоично) се получава 1.25 (десетично)? Това ме обърква.


за fraction имаш:
0100000000000000000000 (това е дробна чист - подобно на 10-тичните но с основа 2 :) )
което е 2^(-2)=0.25

от (1+fraction):
1 + 0.25 = 1.25

Автор:  uglyduck [ Сря Авг 11, 2010 4:13 pm ]
Заглавие: 

Загрях :)
Бях свикнал да чета двоичните числа от дясно на ляво - понеже младшия бит е обикновено в дясно. Примерно 0011 bin = 3 dec...
При floating pointa малко извратено ми се вижда, още повече, че и във въпросната документация са посочили младшия бит от дясно. Както и да е, вероятно си има причини; ще свикна.

Значи просто мантисата (fraction според IEEE) се смята така (подразбира се, че най-старшият бит на мантисата винаги е 1) - примерно:
01100.....0 става равно на
0 * 1/2^1 + 1 * 1/2^2 + 1 * 1/2^4 = 1/4 + 1/8 = 0.25 + 0.125 = 0.375
и като добавим подразбиращата се единица става 1.375

Автор:  ike [ Сря Авг 11, 2010 4:17 pm ]
Заглавие: 

За домашно представи числото 3.375 :)

Автор:  uglyduck [ Сря Авг 11, 2010 6:17 pm ]
Заглавие: 

Много смешно :)

3.375 => S = 0
E = 10000000 bin = 128 dec
F = 101100...0 bin = 0.6875 => fraction = 1.6875

=> V = (-1)^S * 2^(E-127) * (1+F) = 1 * 2^1 * (1+0.6875) = 3.375

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/