перевод числел с запятой

Тема в разделе "WASM.BEGINNERS", создана пользователем Necromancer13, 26 окт 2007.

  1. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    пожалуйста, помогите научить преобразовывать десятичные числа с запятой в шест....

    потому, что я пишу
    push 3.2
    а в отладчике (OllyDebugger) вижу
    push 404CCCCD...

    никак не помйму, как это переводить...
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Necromancer13
    Вещественные числа в памяти компьютера хранятся в нормализованном виде, то есть оно обязательно должно иметь следующий вид: 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
    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~3.2
     
  3. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    спасибо, только я не очень понял:dntknw:
    что значит символ "^" ?
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Necromancer13
    символ "^" это степень
     
  5. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    то есть 2^3 это 2 в третей степени?
     
  6. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    В точку!
    Как результат: 2^3=8
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    угу ;) Иногда еще уголок рисуют в старых советских книжках ;)
     
  8. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    ага, понял, спасибо...
    но как переводить все-равно не понял:dntknw:

    193,75=128+64+1+1/2+1/4=11000001,11b=1,100000111b*2^7=4341C000h

    193 это 128+64+1 - до этих пор все понятно... а потом деление..... и дальше не понимаю
     
  9. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Necromancer13
    Если уж взялись изучать Великий и Могучий Ассемблер,
    то потрудитесь хотя бы книжку купить. В книге Юрова ОЧЕНЬ подробно это описано.
    Как хранятся, переводятся, флоат числа и какие есть команды сопроцессора. (Надеюсь это слово не пугает?)
     
  10. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    я сначала по рассылке Калашникова, потом уроки ICZELION'а, "уроки крэкинга с помощью OllyDebugger'a", теперь учу по учебнику Крупника (только он для МАСМа, а я на ФАСМе пишуууу)...
    а Юрова учебника у меян нету...
    где-то надо скачать... а может и заказать:) а то купить у меня в городе не получится, это маленький украинский город и тут такие книги редко бывают.. легче заказать
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Да и на сайте есть цикл статей про FPU.
     
  12. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    сейчас поищу...
     
  13. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    ну вот объясните плиз!:dntknw:

    с учебника Юрова: (скачал все-таки...)

    "Затем переведем дробную часть десятичного числа 108,406 (рис. 4.6) по при-
    веденному ранее алгоритму.
    Результат перевода следующий:
    108,406 = 1101100,011001111."

    почему 108,406 это 1101100,011001111 ..?

    да... 1101100 это 108, но ведь 011001111 это 207, а не 406!! :dntknw:(
     
  14. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Да не, всё правильно. Здесь только путаница с системами счисления, лучше всегда указывать в какой системе работаем. Например, Си-синтаксисом.
    Смотрите(оберну все в [ code ] для наглядности):

    Код (Text):
    1. 108,406(dec) = 1101100,011001111(bin)
    2.  
    3. целая часть:
    4. (bin) 0110 1100
    5. (hex)    6    C
    6. Тут всё понятно.
    7.  
    8. Теперь дробная часть:
    9. (bin) 0110 0111 1(000), число не измениться если к нему добавить сколь угодно 0*2^(-n)
    10. (hex)    6    7     8
    11.  
    12. итого, если перевести дробную часть в десятичную систему:
    13.  
    14. 6*(16^(-1)) + 7*(16^(-2)) + 8*(16^(-3)) =
    15. 6/(16^1) + 7/(16^2) + 8/(16^3) = 1656/4096 = 0.404 ~= 0.406
    16.  
    17. ну или в двоичную(десятичными цифрами):
    18.  
    19. 0/(2^1) + 1/(2^2) + 1/(2^3) + 0/(2^4) + 0/(2^5) + 1/(2^6) + 1/(2^7) + 1/(2^8) + 1/(2^9) + 0/(2^10) + 0/(2^11) + 0/(2^12)
     
  15. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    но почему дробная часть (406) это 011001111 ?
     
  16. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    как мне, например, вручную переводить дробную часть в десятичной с.с. в двоичную?
     
  17. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Вот вроде бы и литература, соответствующая, у вас имеется, а думать сами совсем не хотите..
    Попробую объяснить на пальцах.

    Возьмем ваше любимое число 0,406. Тоесть некоторую количественную меру, записанную в 10-ой системе счисления. Каким образом нам можно перевести дробную часть данного числа из десятичной с.с в десятичную с.с.? Если подумать, то можно сообразить, что необходимо последовательно "поглощать" отрицательные степени десятичной системы счисления и тогда нужные нам "цифры"(некая количественная мера) будут сами как-бы "выдавливаться" из дробной части в строгой последовательности.
    Проверим:
    0,406 * 10 = 4,06
    0,06 * 10 = 0,6
    0,6 * 10 = 6,0
    0,0 * 10 = 0,0
    т.е. получили 4060(dec)
    логично предположить, что остановить перевод можно когда дробная часть становиться равной нулю, ну или когда достигнем нужного предела степени точности.

    Попробуем сделать тоже для 16-ричной системы(будем "поглощать" 16-ричные отрицательные степени):
    0,406 * 16 = 6,496
    0,496 * 16 = 7,936
    0,936 * 16 = 14,976
    0,976 * 16 = 15,616
    0,616 * 16 = 9,856
    и т.д. пока не надоест.
    т.е. получили 67ef9(hex)

    В двоичную систему(и другие) для разминки я думаю переведете сами.
     
  18. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Так ведь это НЕ 406 должно быть равно 011001111!
    Это 0.406 = 0.011001111 или 406/1000 ~ 207/512. Ну а то, что равенство не точное, так ведь на то есть и еще другие степени двойки...
     
  19. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    ну я не могу перевести:dntknw:(

    например, перевожу число 3.2 с десятичной в шестнадцатеричную...

    3 это 11b
    0,2 это:
    0,2 * 2 = 0,4
    0,4 * 2 = 0,8
    0,8 * 2 = 1,6
    0,6 * 2 = 1,2

    значит 3,2 = 11,0011 = 1,10011 * 2^1

    значит знак - 0 (+)
    порядок - 10000000b
    мантисса - 10011 (первый бит "в уме")

    значит
    3,2 = 0|10000000|10011000000000000000000

    но 01000000010011000000000000000000b это 404C0000, а не 404CCCCD!!! а у меня отладчик показывает, что это 404CCCCD
     
  20. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    ну что я неправильно делаю?:dntknw: