Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 6

Ошибка при выполнении операции Mod

07.04.2013, 18:53. Показов 1955. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
У меня возникла проблема при выполнении операции Mod с большими числами.
Допустим у меня есть такой простейший код:
PureBasic
1
2
3
4
5
6
Private Sub Command1_Click()
f = 25
v = 41
s1 = f ^ 31 Mod v
Print s1
End Sub
В этом случае выдаётся ошибка: run-time error '6': Overflow. Если же заменить числа на небольшие, то всё считает нормально.
Подскажите, пожалуйста, что не так.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2013, 18:53
Ответы с готовыми решениями:

Как подавить скачки экрана при выполнении операции Workbooks.Open(.)?
Всем добрый день. В цикле открывается множество файлов командой Set book=Workbooks.Open(addr). Из-за этого экран скачет туда-обратно....

Ошибка при выполнении арифметической операции
Здравствуйте! Написал программу для вычисления арифметического выражения X = -(C+2A+4B+B) Работаю в emu8086. При выполнении...

Произошла ошибка при выполнении операции
Давным давно 1 винт был разбит на 2 части и все прекрасно работало, но вот как 2 дня, у винта пропал 2 часть. На этот винт установлена...

8
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
07.04.2013, 19:00
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Оператор Mod работает только с числами не превышающими диапазон Long, используй Double
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Form_Load()
    Dim F As Double, V As Double, S1 As Double
    F = 25
    V = 41
    S1 = rMod(F ^ 31, V)
    Print S1
End Sub
Public Function rMod(ByVal Op1 As Double, ByVal Op2 As Double) As Double                ' Возвращает остаток от деления одного указанного числа на другое указанное число.
    rMod = (Abs(Op1) - (Abs(Op2) * (Int(Abs(Op1) / Abs(Op2))))) * Sgn(Op1)
End Function
1
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 6
07.04.2013, 19:11  [ТС]
Попробовал сделать так, но в результате всегда выдаёт 0.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
07.04.2013, 19:14
Что-то не правильно значит ты пробывал
Миниатюры
Ошибка при выполнении операции Mod  
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
07.04.2013, 19:27
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Можно проще
Visual Basic
1
2
3
Public Function rMod(ByVal Op1 As Double, ByVal Op2 As Double) As Double                ' Возвращает остаток от деления одного указанного числа на другое указанное число.
    rMod = Op1 - Op2 * Fix(Op1 / Op2)
End Function
Подробнее тут: Можно ли получить остаток от деления
1
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 6
07.04.2013, 19:48  [ТС]
Да, вроде бы получилось.
Но получилось число -3,09485009821345E+26, а по-моему это неправильный результат.

Посчитал на калькуляторе - получилось, что остаток от деления равен 25.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
07.04.2013, 20:52
Это из-за конечной точности типа Double:
Visual Basic
1
2
3
4
5
6
Private Sub Form_Load()
    Dim F As Double, V As Double, S1 As Double
    F = 25 ^ 31
    V = F + 1
    S1 = V - F
End Sub
Есть еще тип Decimal, но для вашей задачи даже его не достаточно (в плане точности). Единственное что могу предложить это реализовывать пользовательский тип (класс) сверхбольших чисел и написать функции для работы со сверхбольшими числами.
1
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
08.04.2013, 00:49
Цитата Сообщение от uncertain Посмотреть сообщение
получилось число -3,09485009821345E+26, а по-моему это неправильный результат
Да, и причину объяснил The trick. Дополню: тип Double хранит 15 десятичных разрядов. 25 ^ 31 = 2х1043, значит, погрешность при работе с таким числом составляет не менее 1028. А Вы хотите получить единицы.
1
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 6
08.04.2013, 20:18  [ТС]
Большое спасибо!
Дополню: тип Double хранит 15 десятичных разрядов. 25 ^ 31 = 2х1043, значит, погрешность при работе с таким числом составляет не менее 1028. А Вы хотите получить единицы.
Буду теперь знать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2013, 20:18
Помогаю со студенческими работами здесь

Ошибка при выполнении многошаговой операции
По нажатию на кнопку должна заполняться таблица ADOTABLE1, но не заполняется из за ошибки "Ошибка при выполнении многошаговой...

Ошибка при выполнении операции Xor
Итак, выполняю операцию Xor к двум спискам, очень большим спискам. И получаю следующую ошибку: Stack space overflow: current size 33624...

Ошибка при выполнении операции с информационной базой
обработка меняет данные в справочнике основные средства УПП лезет в эксель, ищет по инв номеру и пищет данные из экселя строк много,...

Ошибка при выполнении файловой операции УНФ
1С:Предприятие 8.3 (8.3.10.2580), УНФ. Режим веб-сервер, приложение - тонкий клиент. При загрузке внешнего файла .mxl выдается ошибка...

Ошибка при выполнении операции с удаленной базой
Добрый ден, уважаемые гуру! У нас администрированием и разработкой в 1С занимается сторонняя организация, но к в данной ситуации сожалению...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru