Портирование FPU на SSE

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mikl___, 14 июл 2020.

  1. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    570
    может стразу long double?
     
  2. Intro

    Intro Well-Known Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    1.668
    ...да ещё UASM делает не правильный вроде как код.
    Если так сделать, то UASM ожидает с точкой число, и сделает ноль.
    vec2d@BitSign __m128d { 8000000000000000h, 8000000000000000h } ;// бит знака double
    А так уже правильно.
    vec2d@BitSign __m128q { 8000000000000000h, 8000000000000000h } ;// бит знака double
    А то у меня не так код работал, пока не разобрался в этой мелочи.

    alex_dz, тогда fsin, там как раз внутренняя точность long double ака real10.
    Так же максимальная точность на -Pi*2..Pi*2 достигает 9 итераций, это для синуса. И погрешность средняя 5.247e-16, а максимальная 1.53e-15, что для double хорошо.
    Тангенс пока не делал, надо таблицу доделать.
     
  3. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    198
    Intro,

    8 знаков это точность zxspectrum:
    Код (Text):
    1. sin 10
    2. -0.54402111
    3. -0.54402111088937
    4.  
    5. sin 20
    6. +0.91294525
    7. +0.91294525072763
    Там для вычислений всей математики использовался один алгоритм - генератор полиномов Чебышева(с разными коэффициентами), именно потому, что сходимость у тейлора плохая. Сами понимаете 8бит/2MHz.. я как то искал где коэффициенты взять для более точного вычисления, так и не нашёл.

    ps:
    Код (Text):
    1. An alternative subroutine for SIN X:
    2. It is straightforward to produce the full expansion of the Chebyshev polynomials and this can be written in BASIC as follows:
    3. 550  LET T =(32*Z*Z*Z*Z*Z-40*Z*Z*Z+10*Z)*A(1)
    4.    +(16*Z*Z*Z*Z-16*Z*Z+2)*A(2)
    5.    +(8*Z*Z*Z-6*Z)*A(3)
    6.    +(4*Z*Z-2)*A(4)
    7.    +2*Z *A(5)
    8.    +A(6)
    9. 560  RETURN
    10. This subroutine is called instead of the SERIES GENERATOR and can be seen to be of a similar accuracy.
    11. An alternative subroutine for EXP X:
    12.      The full expansion for EXP X is:
    13.    
    14. 550  LET T =(128*Z*Z*Z*Z*Z*Z*Z-224*Z*Z*Z*Z*Z+112*Z*Z*Z-14*Z)*A(1)
    15.    +(64*Z*Z*Z*Z*Z*Z-96*Z*Z*Z*Z+36*Z*Z-2)*A(2)
    16.    +(32*Z*Z*Z*Z*Z-40*Z*Z*Z+10*Z)*A(3)
    17.    +(16*Z*Z*Z*Z-16*Z*Z+2)*A(4)
    18.    +(8*Z*Z*Z-6*Z)*A(5)
    19.    +(4*Z*Z-2)*A(6)
    20.    +2*Z*A(7)
    21.    +A(8)
    22. 560  RETURN
    --- Сообщение объединено, 13 апр 2025 в 00:58 ---
    Вот нашёл как коэфф получаются:

     

    Вложения:

    • zx.pdf
      Размер файла:
      1,6 МБ
      Просмотров:
      11
    Последнее редактирование: 12 апр 2025 в 23:11
    Mikl___ и alex_dz нравится это.