Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 23:14

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Длинная арифметика
СообщениеДобавлено: Пн июл 26, 2021 13:47 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Вот делаю себе длинную арифметику в кач-ве либы.

Возник вопрос. что делать с умножением?
Просто если множитель в 4 байта, то умножать может быть некорректно даже на байт.

Все остальный операции (сложение, деление и пр.) оперируют 2-байтовыми значениями.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Длинная арифметика
СообщениеДобавлено: Вт июл 27, 2021 08:29 
Не в сети

Зарегистрирован: Пн янв 28, 2019 03:10
Сообщения: 174
Благодарил (а): 20 раз.
Поблагодарили: 13 раз.
А почему бы не использовать GMP (GNU Multiprecision Library)? Какой выигрыш ожидаете от собственной библиотеки?

У Интела есть умножение 32 бита на 32 бита с 64-битным результатом. ИМХО, такие вещи лучше делать в машинном коде.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Длинная арифметика
СообщениеДобавлено: Вт июл 27, 2021 09:16 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
А) не тянуть зависимостей, DLL и прочего. Поскольку либа нужна раза полтора.
Б) Не лезть в ассемблер, делать мне блин нечего реализовывать все это ещё в маш. коде, чтоб при портировании с 32 на 64 бита либа превратилась в говно.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Длинная арифметика
СообщениеДобавлено: Вт июл 27, 2021 18:05 
Не в сети

Зарегистрирован: Пн янв 28, 2019 03:10
Сообщения: 174
Благодарил (а): 20 раз.
Поблагодарили: 13 раз.
Вот как раз для полутора раз можно было бы и подтянуть DLL не в стандартную систему, а в те приложения, где она нужна. Впрочем, дело Ваше, я только на вопрос ответил.
Если хочется непременно на Форте, то в описании eForth-a (PDF-ка гуглится по строке "eForth overview") есть реализация арифметики (в том числе и умножения UM* ( n n -- d )) через сложение с переносом UM+ ( n n -- d ), но скорость оставляет желать лучшего.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Длинная арифметика
СообщениеДобавлено: Сб авг 14, 2021 10:52 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Вот обожаю наше скромное сообщество!
Называется, сам спросил сам ответил.
Реализовал упрощенный вариант алгоритма Карацубы.

Фрагмент ООП-кода.

Код:
\ См. алгоритм Карацубы
\ общее: a*c*base*base + (a*d+b*c)*base + b*d
\ частное a*d*base + b*d
M: L*
{ a \ b d addr cnt k }
a VRS
FROM a V@ TO b \ раскладываем число
TO a
0 DUP TO cnt TO k
POINT @ TO addr
BEGIN cnt LEN @ XOR WHILE
addr C@ TO d \ мы работаем с байтами, так что считаем, что C равно 0. Отсюда и упрощенная формула
b d *
k +
DUP
addr C!

8 RSHIFT \ мы записали байт в длинное число, отсекаем его
a d * VLS/2 \ сдвиг влево на 8 байт
+   
TO k
FROM addr    1+!
FROM cnt    1+!
REPEAT
;



_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB