![]() |
|
![]() ![]() ![]() |
|
zz113 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
Не умею пользоваться этим извините, вопрос такой: при переводе вещественных туда-обратно по известным логорифмическим формулам
(10^(X) = 2^(X * LOG2(10)) и т.д.)возникают ошибки округления, в последних знаках, которые иногда очень не приятны. На пример ассемблер идеально компилирует dt 1.e123, а лог. формулы не совсем, т.е. как создать в памяти 10 байтовое число 1.e123, 2-ая мантисса, смещенный порядок, также, как это делает компилятор. |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 8 Всего: 14 |
zz113
Не понял вопрос? Как вручную перевести вещественное число в hex? Вещественные числа в памяти компьютера хранятся в нормализованном виде, то есть оно обязательно должно иметь следующий вид: S*M*2^P, где S — знак (+1|-1), M — двоичная мантисса числа, P — порядок двоичного числа. Из-за того, что старший разряд двоичной мантиссы всегда равен 1, его предпочитают «хранить в уме» и не занимать место в памяти. Для упрощения вычислений значение порядка хранят не в дополнительном, а в смещенном коде. В смещенном коде число суммируется с константой, которая для N-битного кода равна 2^(N-1)-1. Т.е. для REAL4 -127=0h, ..., -1=7Eh, 0=7Fh, 1=80h, ..., 128=0FFh. Вещественные числа могут быть 32-битовыми, 64-битовыми и 80-битовыми (REAL4, REAL8 и REAL10 соответственно). При переводе десятичного вещественного в hex отдельно переводим целую и дробную части: 193,75=128+64+1+1/2+1/4=11000001,11b=1,100000111b*2^7=4341C000h Преобразуем число 4341C000h в бинарное представление 0-100.0011.0-100.0001.1100.0000.0000.0000 0(Знак числа "+"=0,"-"=1)-10000110(Порядок =+7 в смещенном коде)-(1),10000011100000000000000b(мантисса числа) переведем pi=3,1415926535897932384626433832795 в hex 1) переводишь в hex раздельно дробную и целую части 3,1415926535897932384626433832795 с целой частью все понятно 3 0,1415926535897932384626433832795*16=2,265482457436691815402294132464 первая цифра после запятой 2 0,265482457436691815402294132464*16=4,247719318987069046436706119424 вторая цифра 4 0,247719318987069046436706119424*16=3,963509103793104742987297910784 третья цифра 3 0,963509103793104742987297910784*16 и так далее получилось 3,243...hex =0011,0010 0100 0011bin=1,1001 0010 0001*2^1 переводим bin в нормализованный вид 0011,0010 0100 0011bin=1,1001 0010 0001*2^1 REAL4 - 40490FDBh, REAL8 - 400921FB54442D18h, REAL10 - 4000C90FDAA22168C233h бит|тип |знак |поле порядка|константа |поле мантиссы 32 |REAL4 |1 бит|8 бит |2^7-1=127 |23 бита 64 |REAL8 |1 бит|11 бит |2^10-1=1023 |52 бита 80 |REAL10|1 бит|15 бит |2^14-1=16383|64 бита 404CCCCD=0-100.0000.0-100.1100.1100.1100.1100.1101= =(1),100.1100.1100.1100.1100.1101*2^1=11,00110011001100110011001 |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Ну вроде бы числа близкие к нулю автоматически преобразуются в денормализованный вид. Так больше точность получается -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm для начинающих" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для начинающих | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |