Вычисление числа Pi

Тема в разделе "WASM.A&O", создана пользователем Intro, 22 окт 2023.

Метки:
  1. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    563
    Нашёл тут алгоритм для вычисления числа π http://litwr2.atspace.eu/pi/pi-spigot-benchmark.html
    Алго годен для теста старых компьютеров, в сайте есть тесты разных старых БК, ПК и мейнфреймов. Для райзена 3600Х код на ассме и на С++ выдаёт 19 мс при 3000 цифры, и 204(с++) и 207 мс при 10000.
    Код (C++):
    1. //число pi с точностью до count_digits знаков. v1.01
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <time.h>
    5.  
    6. int main(int argc, const char **argv)
    7. {
    8.     int count_digits = 50;
    9.     if (argc>1)
    10.         count_digits = atol(argv[1]);
    11.     printf("Count digits: %d\n", count_digits);
    12.     char *pStr = new char[count_digits + 1];
    13.     int size_data = (count_digits/4)*14;
    14.     int *pData = new int[size_data+1];
    15.     clock_t time = clock();
    16.     for (int i = 0; i<size_data; i++)
    17.         pData[i] = 2000;
    18.     char *pN = pStr;
    19.     for (int k=size_data, c = 0; k>0; k-=14){
    20.         int d = 0;
    21.         for (int i = k;;){
    22.             d += pData[i] * 10000;
    23.             int b = i * 2 - 1;
    24.             pData[i] = d % b;
    25.             d /= b;
    26.             i--;
    27.             if (i == 0) break;
    28.             d *= i;
    29.         }
    30.         unsigned int a = c + d / 10000; c = d % 10000;
    31.         for (int i=4; i;){
    32.             char    chr = a % 10;
    33.             a /= 10u;
    34.             pN[--i] = chr+'0';
    35.         }
    36.         pN += 4;
    37.     }
    38.     *pN = 0;
    39.     printf("%s\ntime: %d ms\n", pStr, clock()-time);
    40.     delete []pData;
    41.     delete []pStr;
    42.     return 0;
    43. }
    Оптимизация деления слабо даёт скорости, проверить свой хеон нет возможности. А как мы помним по тестам с простыми числами, райзен проигрывает даже старому хеону из-за делений. Возможно код с++ сможет обойти версию на ассме на других процессорах.
     

    Вложения:

  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.721
    Возможно, что не в тему, но вот попытка заменить команду FLDPI чтобы затруднить анализ программы. Используется свойство [math]arctg(1.0)=\frac{\displaystyle \pi}{\displaystyle 4}[/math]
    Код (ASM):
    1.  fld1
    2.  fadd st,st;st(0)=2.0
    3.  fld st
    4.  fld st
    5.  fpatan;ST(1)=arctg(ST(1)/ST(0))=arctg(1.0)=pi/4=0.7853981633974, вытолкнуть из стека
    6.  fscale; ST(0)=ST(0)x2^{ST(1)}   0.7853981633974 * 4=3.141593265358979323…
     
    Application нравится это.
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.106
  4. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.106
    кстати, смеха ради прикрути к этой смехоте длинную арифу а-ля https://gmplib.org/ и сравни получаемые дельты - реальное вычисление того же числа пи без длинной арифы невозможно (если речь идёт о чём-то большем, чем 10 знаков опосля запятой) :grin: