| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Остаток от деления |
| Автор: poisonX 18.2.2006, 11:37 |
| Помогите решить вопрос: необходимо найти остаток от деления очень большого числа на другое не обязательно большое. Например: e := 1,00175779247994E3664; n := 3239; Необходимо найти: ost := e mod n; Дело в том, что в памяти e помещается только как тип extended (хотя нет необходимости чтобы оно являлось с плавающей точкой), но операцию mod можно проводить только с целыми числами, а в любое из integer такое число переполняет. Как быть в этом случае? |
| Автор: Fin 18.2.2006, 11:42 |
| У тебя настолько будет большая целая часть, что я не думаю, что у тебя класическими методами получится выташить остаток от деления. Надо использовать библиотеки поддерживаюшие большие числа. |
| Автор: poisonX 18.2.2006, 11:49 |
| Как это сделать? |
| Автор: Fin 18.2.2006, 11:53 |
| Иши библиотеку арифметики большого числа. Или создай ее сам. Просто у тебя число настолько большое, что будет откидываться часть числа при делении. И естественно это будет сказываться на конечном результате. |
| Автор: poisonX 18.2.2006, 11:59 |
| Да скорее всего никакого результата не будет, т.к при обработки такого числа происходит исключение. |
| Автор: Guedda 18.2.2006, 12:30 |
| А почитать документацию по модулю Math.pas? Там очень много всего есть |
| Автор: poisonX 18.2.2006, 12:38 |
| Например? |
| Автор: Fin 18.2.2006, 12:49 |
| Можно сделать так. Последовательно выбирать целую часть из числа. 1. Все что после Е откладываем пока в сторонку. У нас останется только 1,00175779247994 2. Доводим это число, так чтобы оно было больше 3239 При этом отнимаем разрядность у числа E 10017,5779247994 Е=3664-4=3660 При каждом декременте Е нужно все время проверять, чтобы Е была больше нуля. Как только Е стало равно 0, перейти к шагу 6. 3. Ишем Число которое было бы кратно числу 3239, но приэтом максимально было бы приближено к делимому 3239*3 = 9717 4. Отнимаем от 10017,5779247994 - 9717 = 300,5779247994 5. Переходим к шагу 2 только Теперь для числа полученного в шаге 4 6. конец |
| Автор: Fin 18.2.2006, 13:12 |
| Я накидал програмку по этому алгоритму на С++. У меня получился ответ 2516. Чуть помудрив с алгоритмом, и перевёл все в целочисленное исчисление получился ответ 1003. |
| Автор: Guedda 18.2.2006, 13:41 |
| Можешь выложить Сишный код сюда, я посмотрю ?? |
| Автор: Fin 18.2.2006, 13:43 | ||||
Добавлено @ 13:48 Тут остались следы от не целочисленного вычисления Добавлено @ 13:54 Вот Код почишенный
|
| Автор: Albinos_x 18.2.2006, 14:27 | ||
простенький вариант:
результат := 3005,779247994 |
| Автор: poisonX 18.2.2006, 15:43 |
| Так, вроде ответ-то должен быть равен 189 |
| Автор: Mayk 18.2.2006, 15:45 | ||
| 1) google говорит, что сущетвуют ExtMod, ExtRem ф-ции в какой-то ESBMaths'е. хмм. 2) В теории может работать вот это (мы вычитаем делитель из делимого пока можем. Для скорости мы вычитаем не один делитель, а 2**i*делитель, где i мы вначале увеличиваем, а потом уменьшаем )
Но на практике - резултат для примера 2838.00. А вот java'вский big decimal говорит, что результат - 1003. Нда. |
| Автор: Albinos_x 18.2.2006, 16:08 | ||
виндовский калькулятор говорит
|
| Автор: Albinos_x 18.2.2006, 16:25 |
| сейчас попробую опытным путём проверить.... |
| Автор: Mayk 18.2.2006, 16:32 |
| а подробнее? зы. ставлю на 1003. уже есть два результат в 1003. |
| Автор: Albinos_x 18.2.2006, 17:44 |
| да вот вроде алгоритм ещё один надумал выполняется долго, но зато (вроде) точно можно узнать ответ... в ручную слишком долго считать... Добавлено @ 17:46 пока алгорит дошёл до 15 значного числа... |
| Автор: Albinos_x 18.2.2006, 19:39 | ||||
первый мой алгорит полностью не верен, т.к. получается что я находил модуль от 100175,779247994 что в корне не верно, тот алгоритм который дошёл до 15 разрядного числа до сих пор считает, поэтому я его немного усовершенствовал.... вот какой получился результат результат:
функция:
ЗЫ: ошибся он тоже говорит 1003... так что я пока в раздумьях... ЗЫЫ: Mayk твой алгоритм дает 275.... |
| Автор: Albinos_x 18.2.2006, 20:08 |
| на большёе время работы не обращайте внимания... просто у меня ещё 2 процесса висели, которые процессор под 100 % загрузили... |
| Автор: Fin 18.2.2006, 20:40 | ||||
| Что то мы совсем забыли школьный курс математики за 2 класс. А в частности деление столбиком Вот программа, которая не просто выдает результат, но и также все число целиком.
Это результат, которая выдала программа:
|
| Автор: Mayk 18.2.2006, 21:11 |
| Мы с компиляторами слегка прозевали что исходное число слегка не поместится в extended. Не паскалевский, не сишный компилеры не заворнингали об этом. Мне потом заместо числа гнус поместил INF. А fmodl от этого безобразия вернула попросту NAN. Если увеличить точность до сверхточных явовских BigDecimal'ов, то ответ таки получается 1003. Правда пока до него дойдёт... (изначальный делитель в результате был домножен где-то на 2**12160) ура! 1003 из четырех разных источников. Думаем ещё. ps. веселая задачка для субботы |
| Автор: Fin 18.2.2006, 21:20 |
| Все правильно 1003. Я в своей последней программе одну степень не добирал. Шас там исправлю результат. |
| Автор: Fin 18.2.2006, 21:34 |
| Albinos_x, Прогони свой алгоритм на таком числе Делимое = 1,00175779247994E+14 Делитель = 3239 Результат должен быть Целая часть = 30927996062 Остаток = 3176 |
| Автор: Albinos_x 18.2.2006, 22:16 | ||||
угу так и получается:
|
| Автор: Albinos_x 18.2.2006, 22:36 | ||||
да по идее должно помещаться.... вот что говорит справка делфи:
|
| Автор: Albinos_x 18.2.2006, 22:54 |
| по алгоритму Mayk-а тоже этот же результат... |
| Автор: Fin 19.2.2006, 16:35 |
| Чтобы число 1.00175779247994E+3664 поместилось полностью в память нужно порядка 12172 бита или 1522 байт. Я не думаю, что в java отводят такое количество памяти под одно число. То что они пишут до 4932 степени, естественно идет обрезка большей части числа. Следовательно в данном случае результат подсчета будет не верен. |
| Автор: Albinos_x 19.2.2006, 21:43 | ||
я тож про это подумал.... вообще у меня есть подозрения, что возможно они используют для этого не те алгоритмы, что тут мы продлогали... |