powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вычисление больший чисел (Owerflow)
20 сообщений из 20, страница 1 из 1
Вычисление больший чисел (Owerflow)
    #39647934
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет

Решил самостоятельно сделать функцию шифрования RSA
Первая проблема, с которой я столкнулся - это вычисление чисел, совсем маленьких в сравнении с поставленной целью.
Public Sub test()

Debug.Print 60 ^ 11 Mod 899

End Sub

Эта процедура выдаёт ошибку Owerflow при делении по модулю, а калькулятор Windows считает. Кто-нибудь знает, как это решить?
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39647958
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,

попробуйте в плавающей арифметике
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Sub test()
dim d1 as double,s2 as double
d1= 60 ^ 11 
d2= 899
Debug.Print d1 Mod d2

End Sub
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39647959
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,

возможно d1= cdbl(60) ^ 11
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648009
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде где-то читал, что в VBA результат целочисленного деления всегда Integer. Это свойство функции и ничего с этим не сделаешь.
Может просто поделить и округлить?
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648015
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев
Код: vbnet
1.
2.
3.
4.
5.
Public Sub test()

    Debug.Print 60 ^ 11 Mod 899
    
End Sub


Эта процедура выдаёт ошибку[/sub] Отож...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Sub test()

x=1
For i = 1 to 11
    x=(x*60) mod 899
Next i

Debug.Print x

End Sub
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648055
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА, ничего не меняется
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648056
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА, в степень возводится без проблем. Ошибка вылазит при делении
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648060
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, это гениально
ща буду въезжать, как это работает
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648072
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только сейчас, работая с числами, я обнаружил одну особенность:

'Эта процедура выдаёт ошибку Overflow

Public Sub test2()

Dim p As Byte
Dim q As Byte
Dim n As Integer

p = 29
q = 31
n = p * q

End Sub


'Эта работает
Public Sub test3()

Dim p As Integer
Dim q As Integer
Dim n As Integer

p = 29
q = 31
n = p * q

End Sub

Оказывается, что результат вычислений при операциях с переменными, не должен превышать их размер. Это кажется нелогичным, так как я этот результат присваиваю отдельной переменной, имеющий достаточный размер для его хранения.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648081
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевТолько сейчас, работая с числами, я обнаружил одну особенность:

'Эта процедура выдаёт ошибку Overflow

Public Sub test2()

Dim p As Byte
Dim q As Byte
Dim n As Integer

p = 29
q = 31
n = p * q

End Sub


'Эта работает
Public Sub test3()

Dim p As Integer
Dim q As Integer
Dim n As Integer

p = 29
q = 31
n = p * q

End Sub

Оказывается, что результат вычислений при операциях с переменными, не должен превышать их размер. Это кажется нелогичным, так как я этот результат присваиваю отдельной переменной, имеющий достаточный размер для его хранения.это ещё почему?
ИМХО, как раз всё логично и прозрачно.
Вы сначала делаете ВЫЧИСЛЕНИЕ и пытаетесь получить результат
Результат вы НЕ ПОЛУЧАЕТЕ.
Собственно, присвоение можно и пропустить.
Ибо написав
Код: vbnet
1.
DEbud.print p * q

вы также получите ошибку
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648082
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*
Код: vbnet
1.
debug.print

конечно же
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648090
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевЭто кажется нелогичным
Прогер_самоучкаИМХО, как раз всё логично и прозрачно.
Вы сначала делаете ВЫЧИСЛЕНИЕ и пытаетесь получить результат
Результат вы НЕ ПОЛУЧАЕТЕ.
Всё даже ещё хуже.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub test()
Dim x As Byte, y As Byte, z As Byte, t As Byte
x = 30
y = 30
z = 30
t = x * y / z '  Overflow !!!! 
End Sub


Вроде бы и результат даже должен быть нормальный - но вот промежуточный результат (а сперва выполняется умножение) не лезет в тип. Соответственно на выходе факап.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648095
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНастаевЭто кажется нелогичным
Прогер_самоучкаИМХО, как раз всё логично и прозрачно.
Вы сначала делаете ВЫЧИСЛЕНИЕ и пытаетесь получить результат
Результат вы НЕ ПОЛУЧАЕТЕ.
Всё даже ещё хуже.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub test()
Dim x As Byte, y As Byte, z As Byte, t As Byte
x = 30
y = 30
z = 30
t = x * y / z '  Overflow !!!! 
End Sub



Вроде бы и результат даже должен быть нормальный - но вот промежуточный результат (а сперва выполняется умножение) не лезет в тип. Соответственно на выходе факап.ну да, правильно всё. Всё происходит в самом процессе.
В вашем случае не доползает дол деления.
В моём случае не доползает до debug.print
В слкчае Настаева ни о каком присвоении переменной значении и речи быть не может.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648304
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВсё даже ещё хуже.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub test()
Dim x As Byte, y As Byte, z As Byte, t As Byte
x = 30
y = 30
z = 30
t = x * y / z '  Overflow !!!! 
End Sub


Вроде бы и результат даже должен быть нормальный - но вот промежуточный результат (а сперва выполняется умножение) не лезет в тип. Соответственно на выходе факап.

Фига се! Только сейчас узанал, что такое "факал"
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39648314
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прогер_самоучкаDim x As Byte, y As Byte, z As Byte, t As Byte


Чисто интуитивно предположил, что промежуточный результат хранится в одной из переменной. Выяснилось, что присвоив любой из переменных х или у размер integer, процедура срабатывает. Допустим, результат хранится в переменной х, размер которой Integer. Но x тоже имеет своё значение. И оно никуда не девается.
Я продолжил эксперимент...
Sub test()

Dim x As Byte, y As Byte, z As Byte
Dim n As Single

n = 15.4999995231628

x = n
y = n
z = n
Debug.Print x * y / z

End Sub


Тут я выяснил максимальное число, которое не округляется до 16. Квадрат этого числа = 240.25. Это < 255. А квадрат 16 = 256. Вот и выходит Overflow.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39649637
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально - две ошибки.

Во первых, надо явно задать тип - вот так, к примеру, работать будет:

Код: sql
1.
2.
Debug.Print 60# ^ 11
Debug.Print CCur(60) ^ 11



Ну или изначально поместить значения в переменные нужного типа и работать с ними.

Второе - если значение превышает максимальное значение Long (то есть 2147483647), то стандартная функция Mod с ним выдаст ошибку! Пишите свою.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39649666
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFстандартная функция Mod с ним выдаст ошибку!Ну как бы MOD таки оператор, а ни разу не функция.
AndrFесли значение превышает максимальное значение Long (то есть 2147483647), то стандартная функция Mod с ним выдаст ошибку
Ты забыл про округление при преобразовании типа
Код: vbnet
1.
2.
3.
dim x as double
x=2147483647.1
debug.print x mod 2 ' output: 1


Ошибка - это не ошибка оператора, а ошибка приведения типа, необходимого для выполнения оператора.
Так что правильнее сказать - если операнд не может быть преобразован в Long.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39649796
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndrF
Код: sql
1.
Debug.Print 60# ^ 11




Простите неуча. А что означает знак решётки?
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39649805
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаевчто означает знак решётки?Обозначение типа значения. "#" - это Double.
...
Рейтинг: 0 / 0
Вычисление больший чисел (Owerflow)
    #39650165
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТак что правильнее сказать - если операнд не может быть преобразован в Long.

Ну я просто не стал жевать до такой степени. Вы же поняли о чем речь...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вычисление больший чисел (Owerflow)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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