возведение числа в степень на ассемблере

Тема в разделе "WASM.BEGINNERS", создана пользователем DANioR, 17 апр 2008.

  1. DANioR

    DANioR Daniel

    Публикаций:
    0
    Регистрация:
    20 мар 2006
    Сообщения:
    23
    Адрес:
    Ukraine
    Добрый день граждане-специалисты.
    Возникла у меня проблема возведения в степень на ассемблере.
    Формула решения есть, но запрограммировать это не получается, мало знаний по FPU.

    результат = Exp("степень" * ln( "база" ));

    Как вы знаете, есть мануал по FPU, "FPHELP.HLP", но он не полный.

    1) может у кого-то есть более полный и понятный мануал.
    2) Как запрограммировать такую формулу.
    3) Забыл сказать, если есть альтернативная формула, очень важно учитывать отрицательные степени.
     
  2. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Код (Text):
    1. ln c:
    2. fldln2
    3. fld c
    4. fyl2x
    5. fstp b
    6.  
    7.  
    8. Exp(x)=a:
    9.         fld x
    10. FLDL2E
    11. FMULP ST(1),ST(0)
    12. FLD ST(0)
    13. FRNDINT
    14. FSUB ST(1),ST(0)
    15. FXCH ST(1)
    16. F2XM1
    17. FLD1
    18. FADDP ST(1),ST(0)
    19. FSCALE
    20. FSTP ST(1)
    21. fstp a
    22.  
    23. z == Power(a,b):
    24. fldln2
    25. fld a
    26. fyl2x
    27. fmul qword ptr b
    28. FLDL2E
    29. FMULP ST(1),ST(0)
    30. FLD ST(0)
    31. FRNDINT
    32. FSUB ST(1),ST(0)
    33. FXCH ST(1)
    34. F2XM1
    35. FLD1
    36. FADDP ST(1),ST(0)
    37. FSCALE
    38. FSTP ST(1)
    39. fstp z
    всё выдрано из дельфи
    есть мануал, в котором исследовали фпу таким же выдирательским методом. писали формулу и смотрели дизассемблером что там накомпилировалось. так что мануалы не нужны
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    DANioR
    Если учитывать все недопустимые варианты (например отрицательное число в дробной степени) и переполнения, то код получается достаточно навороченным. Поэтому лучше не изобретать, а взять готовый код, например из борландовского C-Билдера (..\source\..\math\pow.asm) или на крайняк из masm32 (..\fpulib\FpuXexpY.asm, хотя этой доморощенной писанине большого доверия нет). Да и поиск по форуму может кое-чего дать, например такой вариант
     
  4. DANioR

    DANioR Daniel

    Публикаций:
    0
    Регистрация:
    20 мар 2006
    Сообщения:
    23
    Адрес:
    Ukraine
    Спасибо....