|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Привет Решил самостоятельно сделать функцию шифрования RSA Первая проблема, с которой я столкнулся - это вычисление чисел, совсем маленьких в сравнении с поставленной целью. Public Sub test() Debug.Print 60 ^ 11 Mod 899 End Sub Эта процедура выдаёт ошибку Owerflow при делении по модулю, а калькулятор Windows считает. Кто-нибудь знает, как это решить? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 10:52 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Настаев, попробуйте в плавающей арифметике Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:26 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Настаев, возможно d1= cdbl(60) ^ 11 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:27 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Вроде где-то читал, что в VBA результат целочисленного деления всегда Integer. Это свойство функции и ничего с этим не сделаешь. Может просто поделить и округлить? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:07 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Настаев Код: vbnet 1. 2. 3. 4. 5.
Эта процедура выдаёт ошибку[/sub] Отож... Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:11 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА, ничего не меняется ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:44 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА, в степень возводится без проблем. Ошибка вылазит при делении ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:45 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Akina, это гениально ща буду въезжать, как это работает ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:48 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Только сейчас, работая с числами, я обнаружил одну особенность: 'Эта процедура выдаёт ошибку 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 Оказывается, что результат вычислений при операциях с переменными, не должен превышать их размер. Это кажется нелогичным, так как я этот результат присваиваю отдельной переменной, имеющий достаточный размер для его хранения. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:02 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
НастаевТолько сейчас, работая с числами, я обнаружил одну особенность: 'Эта процедура выдаёт ошибку 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.
вы также получите ошибку ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:09 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
* Код: vbnet 1.
конечно же ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:10 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
НастаевЭто кажется нелогичным Прогер_самоучкаИМХО, как раз всё логично и прозрачно. Вы сначала делаете ВЫЧИСЛЕНИЕ и пытаетесь получить результат Результат вы НЕ ПОЛУЧАЕТЕ. Всё даже ещё хуже. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Вроде бы и результат даже должен быть нормальный - но вот промежуточный результат (а сперва выполняется умножение) не лезет в тип. Соответственно на выходе факап. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:19 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
AkinaНастаевЭто кажется нелогичным Прогер_самоучкаИМХО, как раз всё логично и прозрачно. Вы сначала делаете ВЫЧИСЛЕНИЕ и пытаетесь получить результат Результат вы НЕ ПОЛУЧАЕТЕ. Всё даже ещё хуже. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Вроде бы и результат даже должен быть нормальный - но вот промежуточный результат (а сперва выполняется умножение) не лезет в тип. Соответственно на выходе факап.ну да, правильно всё. Всё происходит в самом процессе. В вашем случае не доползает дол деления. В моём случае не доползает до debug.print В слкчае Настаева ни о каком присвоении переменной значении и речи быть не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:22 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
AkinaВсё даже ещё хуже. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Вроде бы и результат даже должен быть нормальный - но вот промежуточный результат (а сперва выполняется умножение) не лезет в тип. Соответственно на выходе факап. Фига се! Только сейчас узанал, что такое "факал" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 19:58 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Прогер_самоучка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. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 20:45 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Изначально - две ошибки. Во первых, надо явно задать тип - вот так, к примеру, работать будет: Код: sql 1. 2.
Ну или изначально поместить значения в переменные нужного типа и работать с ними. Второе - если значение превышает максимальное значение Long (то есть 2147483647), то стандартная функция Mod с ним выдаст ошибку! Пишите свою. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 01:43 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
AndrFстандартная функция Mod с ним выдаст ошибку!Ну как бы MOD таки оператор, а ни разу не функция. AndrFесли значение превышает максимальное значение Long (то есть 2147483647), то стандартная функция Mod с ним выдаст ошибку Ты забыл про округление при преобразовании типа Код: vbnet 1. 2. 3.
Ошибка - это не ошибка оператора, а ошибка приведения типа, необходимого для выполнения оператора. Так что правильнее сказать - если операнд не может быть преобразован в Long. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 07:58 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
AndrF Код: sql 1.
Простите неуча. А что означает знак решётки? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 11:57 |
|
Вычисление больший чисел (Owerflow)
|
|||
---|---|---|---|
#18+
Настаевчто означает знак решётки?Обозначение типа значения. "#" - это Double. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 12:07 |
|
|
start [/forum/topic.php?fid=45&fpage=50&tid=1611408]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 273ms |
total: | 417ms |
0 / 0 |