Нахождение остатка от деления, от большого числа...

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
bilymo
Сообщения: 3
Зарегистрирован: 11 май 2013, 00:39

13 мар 2014, 17:05

Здравствуйте дорогие форумчане!!! Дело в том, что при возведении числа в большую степень(число в степени 512) и нахождения остатка от деления приводит к ошибке: Invalid floating point operation.

Код: Выделить всё

<...>
var
k,q,l,ff,k1:longint;
  w,u:extended;
  x1:extended;
 
//x1:=1111; k1:=512;
 
     w:=trunc(exp(ln(x1)*k1)) mod 931; //round пробовал, то же не помогает :(
     form1.Memo4.Lines.Add(inttostr(w));

 
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

14 мар 2014, 13:43

Максимальная степень в которую Вы сможете возмести 1111 — это 101. Получится 4,14114038172942E+307 Это предел для используемых тут типов.
Если нужно возводить именно в степень 512, то Вам придётся реализовывать свою собственную арифметику с большей разрядностью, чем Extended.
Проще будет реализовать целочисленную арифметику и возведение в степень умножением.

Как-то раз я реализовывал "неограниченную" разрядность. Просто написал алгоритмы основных арифметических операций для чисел, которые хранятся в WideString: сложение разрядов, переносы, заёмы… Всё как в начальной школе. Нормально работало. К сожалению, ничего не сохранилось.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

14 мар 2014, 14:28

Более того, после Trunc число переходит из 80 бит в 32 бита. Какой там остаток от деления может быть, если все младшие биты теряются. Тоже самое происходит, когда считаем 1111 в степени 101. Попробуйте прибавить к этому числу 1 - результат не изменится, потому что число хранится в экспоненциальном виде. А для mod это очень критично. Здесь только своя арифметика. Достаточно реализовать сложение и деление. Ничего сложного, по времени часа на два работы, вместе с дебагом.
It's a long way to the top if you wanna rock'n'roll
bilymo
Сообщения: 3
Зарегистрирован: 11 май 2013, 00:39

15 мар 2014, 13:07

Naeel Maqsudov писал(а):Максимальная степень в которую Вы сможете возмести 1111 — это 101. Получится 4,14114038172942E+307 Это предел для используемых тут типов.
Если нужно возводить именно в степень 512, то Вам придётся реализовывать свою собственную арифметику с большей разрядностью, чем Extended.
Проще будет реализовать целочисленную арифметику и возведение в степень умножением.

Как-то раз я реализовывал "неограниченную" разрядность. Просто написал алгоритмы основных арифметических операций для чисел, которые хранятся в WideString: сложение разрядов, переносы, заёмы… Всё как в начальной школе. Нормально работало. К сожалению, ничего не сохранилось.
А не могли бы вы указать ссылку, где можно взглянуть на вашу реализацию?
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

19 мар 2014, 11:21

bilymo писал(а):А не могли бы вы указать ссылку, где можно взглянуть на вашу реализацию?
Прочитайте еще раз последнюю фразу поста.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить