FPU и 10^X

Тема в разделе "WASM.A&O", создана пользователем shoo, 8 дек 2004.

  1. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    В masm32lib имеется процедурка, возводящая 10 в степень Х табличным методом. я так понял это для скорости, так как иначе придется нудно калькулировать через логарифмы и степени двойки. вопрос: третьего не дано? (умножать/делить на 10 4096 раз не считается)
     
  2. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    shoo

    Это для скорости.
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    спасибо!

    это мне напомнило историю как нам задали синусоиду нарисовать, а я не знал, как в паскале вещественное в целое преобразовать.

    [​IMG] _1147243534__SINUS.PAS
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    вопрос: третьего не дано?



    Есть более быстрые общие методы возведения в степень.

    Кнут рулит - метод цепочек.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Чего там у Кнута, к сожалению и стыду своему, не знаю. А вот в дельфях используется такой способ возведения base в целую степень exponent (наверное из того же Кнута):
    Код (Text):
    1.     mov eax,[exponent]
    2.     fld1
    3.     fld [base]
    4.     jmp @@2
    5. @@1:
    6.     fmul st,st  
    7. @@2:
    8.     shr eax,1
    9.     jnc @@1
    10.     fmul st1,st
    11.     jnz @@1
    12.     fstp
    13.     ;в st - результат
    Это для положительной степени. Для отрицательной берется ABS(exponent), а в конце fld1 и fdivrp. Здесь число умножений = log2(exponent).
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    честно говоря, я и сам сторонник табличных методов, просто мне тамошняя таблица по глазам ударила. я ее пока преобразовал к приятному (на мой взгляд) виду:


    Код (Text):
    1.  
    2. ten_1   dt 1.0e0001,1.0e0002,1.0e0003,1.0e0004
    3.         dt 1.0e0005,1.0e0006,1.0e0007,1.0e0008
    4.         dt 1.0e0009,1.0e0010,1.0e0011,1.0e0012
    5.         dt 1.0e0013,1.0e0014,1.0e0015
    6.  
    7. ten_16  dt 1.0e0016,1.0e0032,1.0e0048,1.0e0064
    8.         dt 1.0e0080,1.0e0096,1.0e0112,1.0e0128
    9.         dt 1.0e0144,1.0e0160,1.0e0176,1.0e0192
    10.         dt 1.0e0208,1.0e0224,1.0e0240
    11.  
    12. ten_256 dt 1.0e0256,1.0e0512,1.0e0768,1.0e1024
    13.         dt 1.0e1280,1.0e1536,1.0e1792,1.0e2048
    14.         dt 1.0e2304,1.0e2560,1.0e2816,1.0e3072
    15.         dt 1.0e3328,1.0e3584,1.0e4096,1.0e4352
    16.         dt 1.0e4608,1.0e4864




    (пришлось поправить из-за табов - прога должна быть)красивой
     
  7. shoo

    shoo New Member

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

    твой способ мне понравился больше всего, когда base неизвестно. спасибо!