Деление с плавающей точкой

Тема в разделе "WASM.ASSEMBLER", создана пользователем Guest, 27 мар 2006.

  1. Guest

    Guest Guest

    Публикаций:
    0
    Помогите плиз не могу чтото понять как делить с плавающей точкой, читал зубкова, но всеже...

    Нужно: _a/_b=21,75
    Код (Text):
    1.  
    2. .data?
    3.     _a  dd  ?
    4.     _b  dd  ?
    5.     _j  dq  ?
    6. .code
    7.     mov _a,87
    8.     mov _b,4
    9.     fld _a
    10.     fdiv    _b
    11.     fist    _j
    12.     mov eax,_j  ; Теперь на eax-21
    13.  


    В общем из стека FPU вывести целое фисло получается, но как дробь получить - не допрет :dntknw:, т.е. как вывести .75 ?

    для вывода на экран уже числа 21.75
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Надо fild _a





    Надо fidiv _b





    Поиск в секции A&O
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Quantum

    Можешь привести рабочий пример? Всю секцию обыскал - ничего не нашел, там половина линков битых.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Corleone

    Тот пример by Black_mirror должен быть доступен в оффлайновой версии форума.



    Рабочий (вроде) пример есть в масме32: \fpulib\FpuFLtoA.asm
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Corleone

    Суть простая, а реализация не очень ;) Особенно для общего случая, навороченного в FpuFLtoA.asm

    Для вывода числа в децимальном виде с фиксированным числом знаков нужно умножить число на соответствующую степень 10 и выгрузить в виде упакованного двоично-десятичного (BCD) числа. Например, для двух знаков
    Код (Text):
    1.   d100 dd 100
    2.   bcd db 10 dup(?)
    3.   ...
    4.   fimul d100
    5.   fbstp bcd
    В bcd старший байт определяет знак, а 9 младших байт это 18 4-битовых представлений десятичных цифр 0..9. Преобразование 4 бит в символ делается просто добавлением 30h. Проблема тут только в том, чтобы найти старшую значащую hex-цифру (чтобы не выводить лишние нули в целой части), правильно вставить десятичную точку и предусмотреть случай, когда целая часть = 0. Логика простая, но возиться лень ;) Поэтому проще использовать готовые функции, хоть и излишне навороченные
     
  6. Guest

    Guest Guest

    Публикаций:
    0
    Действительно FPU сложновато да и лень юзать =)

    Выход нашел все в том же масме! Вот кто рулит и продолжает рулить!
    Код (Text):
    1.  
    2. LOCAL   buffer[MAX_PATH]:byte
    3. LOCAL   divData[10] :byte
    4.  
    5.     invoke  FpuDiv,Total,Time,addr divData,SRC1_DIMM or SRC2_DIMM
    6.     invoke  FpuFLtoA,addr divData,2,addr buffer,SRC1_REAL or SRC2_DIMM
    7.     invoke  SetWindowText,hPerMin,addr buffer
    8.  
    9.  
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Corleone

    > "Выход нашел все в том же масме! Вот кто рулит и продолжает рулить!"



    Если уж на то пошло, то для ленивых рулит Delphi ;)))))))
    Код (Text):
    1. Edit1.Text:=FormatFloat('0.00',Total/Time);
     
  8. Guest

    Guest Guest

    Публикаций:
    0
    leo

    Я не признаю ничего кроме <font size=14>Masm32</font><!--size-->.

    Делфи - это мерзость! Опитмизация на высшем уровне!
     
  9. IceStudent

    IceStudent Active Member

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


    Зря. Фасм лучше :)
     
  10. Guest

    Guest Guest

    Публикаций:
    0
    IceStudent

    Ну от многих я слышал про то что лучше фасм, но очень привык в масму, как ни крути а 3,5 года на масме срок внушительный, к тому же не любитель я менять обстановку =)

    Ладно, т.к. деление с плавающей запятой я освоил, считаю тему закрытой, всем спасибо за ответы
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Corleone

    Масм масму рознь - одно дело ассемблер, другое дело левые сборные солянки под назвнием fpulib и т.п.

    Обрати внимание на комментарий к FpuDiv.asm

    "This procedure was written by Raymond Filiatreault, December 2002. Modified March 2004 to avoid any potential data loss from the FPU"

    Т.е. почти полтора года "левая" FpuDiv страдала потенциальным багом и сколько таких багов еще сидит в этих либах точно неизвестно. Так что не обольщайся ;)
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ха-ха. Пожалуй я поторопился с выводами - возможные баги это фигня по сравнению с чудесами "оптимизации" fpulib. Посмотрите например, во что гений Raymond Filiatreault'а превратил элементарное fld+fmul+fstp в своей чудо-функции fpmul =8O. Эти люди еще чего-то ворчат о дельфийской оптимизации: если бытует мнение, что дельфя писана для студентов, то masm32\fpulib - для пассажиров с детьми и инвалидов :)))))) Число строк кода и условных переходов потрясает воображение и не поддается подсчету - просто overflow. Но верх оптимизации это FSAVE и FRSTORE, которые понатыканы во все fp-функции. Для справочки - на всех процессорах регистровые FADD\FSUB выполняются 3-5 тактов, FMUL 4-7, с операндами из памяти чуть дольше. А вот FSAVE\FRSTORE не менее полторы сотни тиков каждая, а на P4 - несколько сотен. Остается надеяться, что никому из любителей masm32 не придет в голову использовать fpulib для серьезных вычислений ;))
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Угу, видел я те функции, улыбнулся какой-то и забросил подальше. Самому проще строить вычисления, чем учить эти функции..
     
  14. Guest

    Guest Guest

    Публикаций:
    0


    Мне всего лишь нужно для подсчета среднего арифметического и вывода его а экран







    То что эта либа написана ч-з *опу я и сам понял