Важная информация

User Tag List

Страница 6 из 32 ПерваяПервая ... 2345678910 ... ПоследняяПоследняя
Показано с 51 по 60 из 312

Тема: Вычисление числа Пи на ассемблере

  1. #51
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    756
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Из интереса посчитал той программкой 1600 знаков - все ОК
    Если совсем грубо, то вероятность появления "цифры" означающей 9999 - порядка 1/10000, да еще и перенос должен быть из следующего разряда, то есть вероятность около 1/100К, поэтому ошибка от 100К знаков может вылезти. Это если она там есть (вдруг ряд сходится так быстро что перенос не возникает), пока это только мое подозрение.

  2. #52
    Activist Аватар для ALS
    Регистрация
    14.09.2012
    Адрес
    г.Севастополь
    Сообщений
    429
    Спасибо Благодарностей отдано 
    239
    Спасибо Благодарностей получено 
    68
    Поблагодарили
    47 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    http://bio.fizteh.ru/student/spravoc...rpfelw5bsu.zip
    999999, пятая седьмая строка
    Последний раз редактировалось ALS; 09.11.2015 в 15:22.

  3. #53
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,863
    Спасибо Благодарностей отдано 
    658
    Спасибо Благодарностей получено 
    1,854
    Поблагодарили
    1,059 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если верить архиву с миллиардом знаков числа пи, который скачал на рутракере, та программа правильно считает максимум 16256 знаков (за 1.7 секунды). Для 8биток выше крыши

    - - - Добавлено - - -

    Если заменить long на int64_t, то правильно считает до 54932 знака включительно (за 25 секунд).

  4. #54
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,852
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    171 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    А тебя не смущает, что ... сейчас программа на асме 8080 наконец-то стала считать быстрее программы на си для z80.
    Смущает. Там есть одна хитрость, которая позволит ускорить наш spigot ( уже наш ) ровно в два раза.

    - - - Добавлено - - -

    Может просто тупо тот алгоритм на асме переписать? Хотя, основная масса времени это всё равно умножение/деление, не думаю, что в сишном рантайме они какие-то неоптимальные.

    - - - Добавлено - - -

    Если только использовать не чисто 32-битные умножение/деление, а смешанные 32/16 битные. В том алгоритме явно указано, что нужно умножать uint32 на uint32, ну и делить также. А на самом деле нужно uint16*uint16 -> uint32, а затем uint32/uint16 -> uint16.

  5. #55
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,863
    Спасибо Благодарностей отдано 
    658
    Спасибо Благодарностей получено 
    1,854
    Поблагодарили
    1,059 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    Может просто тупо тот алгоритм на асме переписать? Хотя, основная масса времени всё равно это умножение/деление
    У тебя есть готовые арифметические процедуры для 32 разрядных? Если да, то я за "тупое переписывание". Пусть даже будет медленнее, чем pirk20, зато больше цифр можно считать.
    У меня были процедурки для 32битных, но они, насколько помню, в архиве на другом компе, который сдох (но винт целый).

  6. #56
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,852
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    171 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну и у нас ещё одно преимущество: вместо двух операций / и % мы делаем это за одну операцию. Фактически, тоже ускорение почти в два раза.

    - - - Добавлено - - -

    Цитата Сообщение от ivagor Посмотреть сообщение
    У тебя есть готовые арифметические процедуры для 32 разрядных?
    16*16 -> 32 вроде где-то было (FAT?), а вот деления точно не было. Но что нам стоит дом построить?

  7. #57
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,863
    Спасибо Благодарностей отдано 
    658
    Спасибо Благодарностей получено 
    1,854
    Поблагодарили
    1,059 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Была старинная математическая библиотека для 8080, но не могу вспомнить как назывался архив или хотя бы кто автор.
    Возможно у vinxru есть готовые процедуры для 32-разрядных для его си?
    Конечно можно и заново написать.

    - - - Добавлено - - -

    В Гуртовцеве Гудыменко есть готовые процедуры для 16*16=32 и 32/16

  8. #58
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,852
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    171 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот это можно как-то ускорить (не разворачивая цикл)?
    Код:
    MUL32:	MOV B,H ; DEHL = DE*HL
    	MOV C,L
    	LXI H,0
    	MVI A,17
    MUL321:	DCR A
    	RZ
    	XCHG
    	DAD H
    	XCHG
    	JC MUL322
    	DAD H
    	JNC MUL321
    	INX D
    	JMP MUL321
    MUL322:	DAD H
    	JNC $+4
    	INX D
    	DAD B
    	JNC MUL321
    	INX D
    	JMP MUL321

  9. #59
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    756
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Если верить архиву с миллиардом знаков числа пи, который скачал на рутракере, та программа правильно считает максимум 16256 знаков (за 1.7 секунды). Для 8биток выше крыши
    Эх, для меня это все очень сложно, качать мегабайтные архивы, сверять
    Есть путь попроще:

    Код:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <windows.h>
    
    #define	NUMS	280000
    
    int main()
    {
       static long r[NUMS + 1];
       long i, k;
       long b, d;
       long c;
       long x;
     
    
       c = 0;
       for (i = 0; i < NUMS; i++)
          r[i] = 2000;
     
       for (k = NUMS; k > 0; k -= 14)
       {
          d = 0;
          i = k;
     
          while (1) 
          {
             d += r[i] * 10000;
             b = i * 2 - 1;
     
             r[i] = d % b;
             d /= b;
     
             i--;
             if (i == 0) break;
     
             d *= i;
          }
     
    	  x = c + d / 10000;
    	  if (x >= 10000)
    	  {
    	      printf("\r\nERROR (%d, %d)", x, k);
    		  break;
    	  }
          printf("%.4d", (int)(c + d / 10000));
           c = d % 10000;
       }
       return 0;
    }
    Сначала оно прикольно упало, когда я NUMS поставил 280000 , стек коротковат оказался, пришлось static вкрутить.
    А потом оно секунд за 10 привело к ошибке:

    ERROR (10000, 119266)

    Ожидаем четыре цифры, а оказывается их пять, и пятая-то, вот досада, должна быть перенесена в уже выведенное, косяк-с, мда.
    Итого - ошибка есть, возникает на 45-тысячной с копейками цифре, если кому надо меньше цифр (ограничен там восьмибитками или еще чего) - то и так сгодится
    Последний раз редактировалось Vslav; 09.11.2015 в 17:08.

  10. #60
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,863
    Спасибо Благодарностей отдано 
    658
    Спасибо Благодарностей получено 
    1,854
    Поблагодарили
    1,059 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    b2m, у меня по той процедуре идей нет. Обещаю не ударяться в паразитическую оптимизацию , если что - ты сам потом оптимизируешь.

    Vslav
    Цитата Сообщение от ivagor Посмотреть сообщение
    Если заменить long на int64_t, то правильно считает до 54932 знака включительно (за 25 секунд).
    У меня пока нет оснований не доверять тому архиву, т.ч. с 45000 я не согласен.

Страница 6 из 32 ПерваяПервая ... 2345678910 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Арифметические процедуры на ассемблере
    от spensor в разделе Программирование
    Ответов: 27
    Последнее: 13.05.2017, 20:56
  2. Мнемокоманды и числа.
    от ALKO в разделе Программирование
    Ответов: 0
    Последнее: 15.02.2014, 03:49
  3. try-catch на ассемблере z80
    от siril в разделе Программирование
    Ответов: 22
    Последнее: 30.10.2012, 21:17
  4. Определение числа сторон
    от mungo в разделе Внешние накопители
    Ответов: 1
    Последнее: 16.03.2012, 18:06

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •