Длинная арифметика

Тема в разделе "WASM.BEGINNERS", создана пользователем Dryu, 10 сен 2009.

  1. Dryu

    Dryu New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    9
    Приветствую. Я, дабы совместить приятное с полезным, пишу библиотеку для работы с длинной арифметикой.
    Формат данных: 1 dword с длиной числа в байтах, далее само число с обратным порядком байт, доп.код.
    Задачи(в порядке убывания приоритета) - максимальная скорость работы, разумный расход памяти. Размер кода не критичен.
    Пока написал сложение, сдвиги и беззнаковое умножение, на знаковом наступил затык. Если умножать 2 числа "столбиком", то потребуется сохранить знаки операндов и перевести их в прямой код, после чего выполнить беззнаковое умножение. Но тогда потребуется или изменять операнды(а они по понятным причинам передаются по ссылке), или на лету создавать буфер под временные переменные, которые могут быть весьма большими. Оба варианта неприемлимы. Если кто работал в этом направлении, поделитесь идеями, пожалуйста.
    Исходники могу дать, но, имхо, пока бессмысленно.
     
  2. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Dryu

    Почему бы не хранить модуль и знак отдельно?
     
  3. Dryu

    Dryu New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    9
    Насколько отдельно? То, что я выставлю его отдельным байтом, не изменит самого алгоритма. Или предлагаете перейти на прямой код?
     
  4. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Ну, например вот так:
    typedef struct _LONG_INTEGER {
    ULONG Length;
    CHAR Sign;
    UCHAR Bytes[ 1 ];
    } LONG_INTEGER, * PLONG_INTEGER;

    Для положительных чисел Sign = 1, для отрицательных Sign = -1. Знак произведения = произведению знаков. А вообще советую глянуть код библиотеки GMP (GNU Multiple Presicion). Она вроде одна из самых шустрых. И много чего умеет. К тому же код открытый. Есть и под Windows и под Unix.
     
  5. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Dryu
    Ну типа как написал Forever или вообще одним битом (как в FPU вроде). Или как packed/unpacked BCD-числа. В любом случае - раз ты написал что приоритетнее скорость - так будет быстрее чем переводить или учитывать знаки в алгоритме.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Dryu
    Зачем из доп. кода переводить-то? Алгоритмов знакового умножения в доп. коде вагон и тележка:
    В столбик с учётом знака, в столбик с корректировкой результата, метод Burks-Goldstine-von-Neumann, метод Робертсона, метод Буса.
     
  7. Dryu

    Dryu New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    9
    В принципе, нашёл алгоритм знакового умножения, но будет несколько геморройно. Погляжу в исходники, спасибо.