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

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

y = (a ^ x) Mod b

И при больших значениях x и b возникает ошибка переполнения (overflow)
Все переменные определены как Variant.
В чем может быть проблема.
...
Рейтинг: 0 / 0
01.11.2006, 20:30
    #34099032
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
Эээ, дай угадаю... В переполнении! Ты случайно не в миллиардную степень возводишь?
...
Рейтинг: 0 / 0
01.11.2006, 20:35
    #34099044
Speaker1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
Да в степень-то число возводиться нормально, а вот после операции mod и происходит переполнение.
...
Рейтинг: 0 / 0
01.11.2006, 20:46
    #34099053
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
Попробуй объявить переменные как double и разбить выражение на две операции. И напиши при каких значениях происходит переполнение.
...
Рейтинг: 0 / 0
01.11.2006, 21:01
    #34099069
Speaker1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
1. y = 134 ^ 7
Результат: y=775771085481344
2. y mod 513
Результат: overflow
...
Рейтинг: 0 / 0
01.11.2006, 23:44
    #34099233
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
y должно быть integer .
...
Рейтинг: 0 / 0
02.11.2006, 06:28
    #34099403
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
хм, ничего не помогает. странная вещь. пробовала у integer, тогда он 1 действие не выполняет. double, variant - второе. кто победит? напишите.
...
Рейтинг: 0 / 0
02.11.2006, 12:39
    #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
02.11.2006, 14:35
    #34101049
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
VladConn , integer не может быть больше 32767 .
...
Рейтинг: 0 / 0
02.11.2006, 15:14
    #34101244
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переполнение
Antonariy,

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

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

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

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

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

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


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