| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Overflow при MOD |
| Автор: gippa 12.5.2006, 20:26 |
| Здравствуйте! Подскажите, пожалуйста, кто знает - как избежать переполнения при выполнении A mod B, при условии, что A - double? Пробовала заменить mod на: C=int( A/B ) D=B*C ostatok=A-D Но результат равен нулю, хотя виндовский калькулятор выдает, что остаток равен 97. Может где точность вычислений подправить? И как это сделать? PS надо посчитать --> 7^101 mod 239 Спасибо заранее : ) |
| Автор: cardinal 13.5.2006, 02:29 |
| Ради прикола начал разбираться с этим калькулятором (у которого нет функции ^) http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=64895&lngWId=1 Возведение в степень я уже реализовал. Осталось сделать Mod результата и если выйдет тоже 97, то считай проблема решена. Как сделаю выложу... Главное преимущество этого калькулятора это использование ассемблера. |
| Автор: gippa 13.5.2006, 09:16 | ||
Да-а... ну и навороченный же там калькулятор |
| Автор: cardinal 13.5.2006, 16:17 | ||
| Короче есть еще один калькулятор BigNumVB.zip, 72kB http://home.versatel.nl/vspickelen/Largefiles/Download.htm (не хуже вроде того, что я вчера нашел) и у него есть операция a^k по крайней мере. Так вот написав такой код
и воткнув в проект файлы Extension.bas, bignumVB.bi, PrintFun.bas и Supplement.bas и в папкус с проектом файл bignumVB.dll ты получишь нужный тебе результат. То есть для того чтобы считать с большими числами (которые VB не поддерживает) тебе нужна спец. библиотека. |
| Автор: gippa 13.5.2006, 17:14 |
| Уххх... как-то все сложно получается, хотя вроде бы пустяковая операция.. Спасибо большое за помощь |
| Автор: Тутанхамец 13.5.2006, 20:45 | ||
Gippa, я запал на твой вопрос И вот к чему это привело:
ИТОГО: 1) Диковатая штука, но зато без ассемблера и калькуляторов. 2) Можно это свернуть в одну строку и обойтись без кучи переменных - я их для наглядности наплодил. 3) Чтоб обрабатывать не только эти числа, а любые, можно написать функцию, наверное. Пусть кто хочет - займется. А может и у меня руки дойдут... P.S. Если что не так... Я все-таки не математик. |
| Автор: gippa 13.5.2006, 21:19 | ||
Я рада, что вопрос такой "заводной" получился А код действительно какой-то хитрый - мое понимание сломалось где-то на 19 строчке Теперь по поводу самого задания. Формула в оригинале выглядит так: X(i+1)=7^X(i) mod 239, а 101 - это X(0). Так что навряд ли этот код можно будет и на все распространить... Тем более дальше (делала ручками на калькуляторе) там значения от единиц до сотен получаются. Надо все-таки какую-нить универсалку сделать. А вообще, спасибо за активное участие! |
| Автор: cardinal 13.5.2006, 21:48 | ||
| Тутанхамец, подсказал мне одну мыслю. Врозможно это
тогда полное (и самое простое) решение задачи. До третьего элемента проверял на калькуляторе - вроде правильно. |
| Автор: gippa 13.5.2006, 23:08 |
| Ура, ура! Cardinal спасибо тебе большое! Действительно все с моими "ручными" ответами сходится! |
| Автор: gippa 16.5.2006, 22:11 | ||
Cardinal! Возник у меня еще один вопрос - чем ты руководствуешься, когда пишешь цикл 7-10 строчки:
Как это можно обосновать? Т.е. может такое "правило" математическое есть? Почему это эквивалентно X(i+1)=7^X(i) mod 239? Спасибо заранее за ответ |
| Автор: cardinal 17.5.2006, 00:30 | ||||||
| Посмотри, что Тутанхамец делает. Он предлагает возводить в степень (намного меньшую заданной), потом делать Mod, а потом возводить результат от Mod'a дальше в степень. На числах можно описать данное так. Давай исходить от простого 7^5 mod 10. То есть цикл крутиться четыре раза. Смотрим что получается.
Если посчитать тоже самое сразу 7^5 mod 10 то получится тот же ответ. Получается, что 49 дает тот же остаток при делении на 10, что и число 9, так зачем нам 49, если можно взять 9 и ничего мы от этого не потеряем. Вся информация, которая нам нужна для Mod'a останется. Можно также привести такое правило (не знаю как его доказать на данный момент
При помощи этого правила я и сделал цикл. |
| Автор: gippa 17.5.2006, 19:40 |
| Cardinal еще раз шлю большие СПАСИБА |