powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Переполнение
16 сообщений из 16, страница 1 из 1
Переполнение
    #34098967
Speaker1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста решить проблему.

Выполняю обычное вычисление:

y = (a ^ x) Mod b

И при больших значениях x и b возникает ошибка переполнения (overflow)
Все переменные определены как Variant.
В чем может быть проблема.
...
Рейтинг: 0 / 0
Переполнение
    #34099032
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ, дай угадаю... В переполнении! Ты случайно не в миллиардную степень возводишь?
...
Рейтинг: 0 / 0
Переполнение
    #34099044
Speaker1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да в степень-то число возводиться нормально, а вот после операции mod и происходит переполнение.
...
Рейтинг: 0 / 0
Переполнение
    #34099053
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй объявить переменные как double и разбить выражение на две операции. И напиши при каких значениях происходит переполнение.
...
Рейтинг: 0 / 0
Переполнение
    #34099069
Speaker1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. y = 134 ^ 7
Результат: y=775771085481344
2. y mod 513
Результат: overflow
...
Рейтинг: 0 / 0
Переполнение
    #34099233
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
y должно быть integer .
...
Рейтинг: 0 / 0
Переполнение
    #34099403
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, ничего не помогает. странная вещь. пробовала у integer, тогда он 1 действие не выполняет. double, variant - второе. кто победит? напишите.
...
Рейтинг: 0 / 0
Переполнение
    #34100460
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что ф-ция MOD не работает с такими большими числами
автор1. y = 134 ^ 7
Результат: y=775771085481344

есть предложение заменить на это (вроде работает нормально)
Код: plaintext
1.
2.
Public Function MyMod(x As Double, y As Double) As Long
    MyMod = Round(((x / y) - Int(x / y)) * y)
End Function

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Переполнение
    #34101049
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConn , integer не может быть больше 32767 .
...
Рейтинг: 0 / 0
Переполнение
    #34101244
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Да, абсолютно. Я имел ввиду Long Integer от -2,147,483,648 до 2,147,483,647

VladConn
...
Рейтинг: 0 / 0
Переполнение
    #34101494
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если быть совсем точным, то положительное значение y должно быть меньше, чем 2147483647.5.
...
Рейтинг: 0 / 0
Переполнение
    #34101515
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot,
Round - это банковское округление. Но здесь это непринципиально - прощес скобочки раскрыть: x - Int(x / y) * y
...
Рейтинг: 0 / 0
Переполнение
    #34104810
Speaker1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт, HandKot.

Спасибо, ребята, выручили.
Всё работает.
Сибирь Вас не забудет.
...
Рейтинг: 0 / 0
Переполнение
    #34105110
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Speaker1,
"Нет, уж лучше вы - к нам" :)

Как прикладной математик, предупреждаю тебя (и не говори, что не слышал), что Int(x / y) может вернуть неожиданный результат в случае вроде бы кратных значений. Утрированно: может оказаться, что Int(15 / 3) = 4 . Почему? Потому что при делении частное оказалось не 5.(0), а (опять утрированно) 4.999999999999998, и, кстати, при отладке стандартными средствами ты этого не увидишь - в десятичном представлении число будет выглядеть как 5, но в двоичном - на единицу в младшем двоичном разряде меньше. Соответственно Int() вернёт 4. Не факт, что ты с этим когда-нибудь столкнёшься, но мне приходилось, и я потерял немало времени на отлов такой ошибки и исправление. Поэтому лучше бы проверить, не получился ли остаток больше делителя. Удачи.
...
Рейтинг: 0 / 0
Переполнение
    #34105115
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее, остаток должен быть меньше делителя, в случае неотрицательного делимого и натурального делителя.
...
Рейтинг: 0 / 0
Переполнение
    #34105778
Speaker1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бенедикт

Спасибо, что предупредил.
Но, к счастью, эта ситуация меня не коснется.
Дело в том, что конечный ожидаемый результат я проверил и он полностью удовлетворил поставленным условиям.
Ведь вычисления с оператором mod это всего лишь маленькая часть крипографического продукта и на эту операцию не делается основного упора.
Проще говоря, то что должно работать - то уже работает.
Еще раз спасибо.

P.S. Не нужно опасаться сибирских краёв. Даже Пушкин наотдыхался здесь вдоволь.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Переполнение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]