![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| poisonX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.1.2006 Репутация: нет Всего: нет |
Помогите решить вопрос: необходимо найти остаток от деления очень большого числа на другое не обязательно большое.
Например: e := 1,00175779247994E3664; n := 3239; Необходимо найти: ost := e mod n; Дело в том, что в памяти e помещается только как тип extended (хотя нет необходимости чтобы оно являлось с плавающей точкой), но операцию mod можно проводить только с целыми числами, а в любое из integer такое число переполняет. Как быть в этом случае? |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
У тебя настолько будет большая целая часть, что я не думаю, что у тебя класическими методами получится выташить остаток от деления. Надо использовать библиотеки поддерживаюшие большие числа.
-------------------- Пролетал мимо. |
|||
|
||||
| poisonX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.1.2006 Репутация: нет Всего: нет |
Как это сделать?
|
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Иши библиотеку арифметики большого числа. Или создай ее сам. Просто у тебя число настолько большое, что будет откидываться часть числа при делении. И естественно это будет сказываться на конечном результате.
-------------------- Пролетал мимо. |
|||
|
||||
| poisonX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.1.2006 Репутация: нет Всего: нет |
Да скорее всего никакого результата не будет, т.к при обработки такого числа происходит исключение.
|
|||
|
||||
| Guedda |
|
|||
![]() Подрывник ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3137 Регистрация: 27.12.2005 Где: Ростов-на-Дону Репутация: 14 Всего: 78 |
А почитать документацию по модулю Math.pas?
Там очень много всего есть -------------------- Ll 2 |
|||
|
||||
| poisonX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.1.2006 Репутация: нет Всего: нет |
Например?
|
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Можно сделать так. Последовательно выбирать целую часть из числа.
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 |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Я накидал програмку по этому алгоритму на С++. У меня получился ответ 2516. Чуть помудрив с алгоритмом, и перевёл все в целочисленное исчисление получился ответ 1003.
Это сообщение отредактировал(а) Fin - 18.2.2006, 13:25 -------------------- Пролетал мимо. |
|||
|
||||
| Guedda |
|
|||
![]() Подрывник ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3137 Регистрация: 27.12.2005 Где: Ростов-на-Дону Репутация: 14 Всего: 78 |
Можешь выложить Сишный код сюда, я посмотрю ??
-------------------- Ll 2 |
|||
|
||||
| Fin |
|
||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Добавлено @ 13:48 Тут остались следы от не целочисленного вычисления Добавлено @ 13:54 Вот Код почишенный
-------------------- Пролетал мимо. |
||||
|
|||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
простенький вариант:
результат := 3005,779247994 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| poisonX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.1.2006 Репутация: нет Всего: нет |
Так, вроде ответ-то должен быть равен 189
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
1) google говорит, что сущетвуют ExtMod, ExtRem ф-ции в какой-то ESBMaths'е. хмм.
2) В теории может работать вот это (мы вычитаем делитель из делимого пока можем. Для скорости мы вычитаем не один делитель, а 2**i*делитель, где i мы вначале увеличиваем, а потом уменьшаем )
Но на практике - резултат для примера 2838.00. А вот java'вский big decimal говорит, что результат - 1003. Нда. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
виндовский калькулятор говорит
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
сейчас попробую опытным путём проверить....
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
а подробнее? зы. ставлю на 1003. уже есть два результат в 1003. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
да вот вроде алгоритм ещё один надумал выполняется долго, но зато (вроде) точно можно узнать ответ... в ручную слишком долго считать... Добавлено @ 17:46 пока алгорит дошёл до 15 значного числа... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Albinos_x |
|
||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
первый мой алгорит полностью не верен, т.к. получается что я находил модуль от 100175,779247994 что в корне не верно, тот алгоритм который дошёл до 15 разрядного числа до сих пор считает, поэтому я его немного усовершенствовал.... вот какой получился результат результат:
функция:
ЗЫ: ошибся он тоже говорит 1003... так что я пока в раздумьях... ЗЫЫ: Mayk твой алгоритм дает 275.... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||
|
|||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
на большёе время работы не обращайте внимания... просто у меня ещё 2 процесса висели, которые процессор под 100 % загрузили...
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Fin |
|
||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Что то мы совсем забыли школьный курс математики за 2 класс. А в частности деление столбиком
Вот программа, которая не просто выдает результат, но и также все число целиком.
Это результат, которая выдала программа:
Это сообщение отредактировал(а) Fin - 18.2.2006, 21:21 -------------------- Пролетал мимо. |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Мы с компиляторами слегка прозевали что исходное число слегка не поместится в extended. Не паскалевский, не сишный компилеры не заворнингали об этом. Мне потом заместо числа гнус поместил INF. А fmodl от этого безобразия вернула попросту NAN. Если увеличить точность до сверхточных явовских BigDecimal'ов, то ответ таки получается 1003. Правда пока до него дойдёт... (изначальный делитель в результате был домножен где-то на 2**12160) ура! 1003 из четырех разных источников. Думаем ещё. ps. веселая задачка для субботы -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Все правильно 1003. Я в своей последней программе одну степень не добирал. Шас там исправлю результат.
-------------------- Пролетал мимо. |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
угу...
мой последний алгоритм по этому же принципу работает..... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Albinos_x, Прогони свой алгоритм на таком числе
Делимое = 1,00175779247994E+14 Делитель = 3239 Результат должен быть Целая часть = 30927996062 Остаток = 3176 -------------------- Пролетал мимо. |
|||
|
||||
| Albinos_x |
|
||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
угу так и получается:
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||
|
|||||
| Albinos_x |
|
||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
да по идее должно помещаться.... вот что говорит справка делфи:
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||
|
|||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
по алгоритму Mayk-а тоже этот же результат... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: нет Всего: 10 |
Чтобы число 1.00175779247994E+3664 поместилось полностью в память нужно порядка 12172 бита или 1522 байт. Я не думаю, что в java отводят такое количество памяти под одно число. То что они пишут до 4932 степени, естественно идет обрезка большей части числа. Следовательно в данном случае результат подсчета будет не верен.
-------------------- Пролетал мимо. |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
я тож про это подумал.... вообще у меня есть подозрения, что возможно они используют для этого не те алгоритмы, что тут мы продлогали... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |