![]() |
|
Модераторы: 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 |
виндовский калькулятор говорит
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
![]()
|
| Правила форума "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. |