Есть ли способ избежать утверждения об ошибке «Арифметическая операция привела к переполнению».?

#vb.net #types

#vb.net #типы

Вопрос:

Я провел некоторые исследования, и общий совет заключается в изменении типа данных переменной, содержащей выражение, на Long или Ulong, но в любом случае я все равно получаю ту же ошибку. Я также попытался заключить выражение с помощью CInt() (или CLong()), чтобы заставить его вырезать десятичную часть, чтобы уменьшить длину вывода выражения, но ни то, ни другое не работает. Все это довольно запутанно. Любая помощь будет глубоко оценена. Блок кода, вызывающий ошибку, выглядит следующим образом;

  Vsf(i) = CInt((((0.91544 - 0.00166 * Angle(i) - 0.000002 * W - 0.054248 * 
 Superelevation(i) - Sidefrictionfactor) / 0.013939) * Radius(i)) ^ 0.5)

 Vro(i) = CInt((((1.04136 - 0.004528 * Angle(i) - 0.000004 * W - 0.338711 * Superelevation(i) - rolloverthreshold) / 0.014578) * Radius(i)) ^ 0.5)


Vmin(i) = CInt(Math.Min(Vsf(i), Vro(i)))
 

Я объявил VSf(), Vro() и Vmin() как целочисленные массивы. Я даже вложил вычислительное выражение в CInt() в надежде, что оно преобразует результат Vro (который вызывал ошибку арифметического переполнения) в целое число и, следовательно, не придется иметь дело с десятичными дробями, что привело бы к большему количеству цифр. Тем не менее, когда я навожу курсор на Vro (i), я вижу 4-значное целое число с десятичными дробями. Не знаю, почему это происходит.

Комментарии:

1. Какое число вы пытаетесь сохранить или какие вычисления пытаетесь выполнить? Любой числовой тип будет иметь минимальное максимальное значение, которое он может содержать, или величину десятичной точности, которую он может поддерживать.

2. На самом деле единственный способ избежать этого — начать использовать что-то вроде десятичных типов

3. @Hursey, только что попробовал десятичный тип. Все еще возникают ошибки.

4. Каковы были бы некоторые примерные значения переменных? и какая именно строка дает вам переполнение?

5. Почему бы не использовать BIGIntegers ? например Dim big1 as new BigInteger(double.MaxValue);

Ответ №1:

Я разбил формулу на части, чтобы попытаться понять, в чем проблема. Все шло своим чередом до самого конца. Если значение, которое нужно увеличить до .5, является отрицательным числом, квадратный корень не дает числа. Я бы выполнил шаги формулы без ^.5 , а затем проверил наличие отрицательного числа.

 Private Sub OPCode()
    Dim Angle = 90.2
    Dim Radius = 100.2
    Dim Superelevation = 37.8
    Dim Sidefrictionfactor = 0.003
    Dim W = 0.00325
    Dim Vsf As Double
    Dim AngleMultiplication = 0.00166 * Angle
    Dim WMultiplication = 0.000002 * W
    Dim SuperelavationMultiplication = 0.054248 * Superelevation
    Dim SubtractResult = 0.91544 - AngleMultiplication - WMultiplication - SuperelavationMultiplication - Sidefrictionfactor
    Dim DivisionResult = SubtractResult / 0.013939
    Dim MultiplyByRadius = DivisionResult * Radius
    Debug.Print(MultiplyByRadius.ToString) 'With my made up values I get a negative number
    Vsf = MultiplyByRadius ^ 0.5 'You cannot get the square root of a negative number
    Debug.Print(Vsf.ToString) 'NaN
    Dim intVsf = CInt(Vsf) 'The Arithematic overflow error occurs here
End Sub
 

Комментарии:

1. Вау, @Mary, это настоящая самоотверженность. Я действительно благодарен вам. На самом деле я пришел к такому же выводу несколько дней назад и, вероятно, должен был обновить сообщение, чтобы показать это, но определенно приятно знать, что мой вывод был подтвержден. Теперь я могу найти способ справиться с этой потенциальной ошибкой. Еще раз большое вам спасибо.

2. @DaVince294 Поскольку вы решили свою собственную проблему, я понимаю, почему вы не приняли мой ответ, но если вы не планируете публиковать свой собственный ответ и принимать его, тогда вы могли бы принять мой, чтобы на вопрос появился ответ.

3. Мне очень жаль, но я немного сбит с толку. Я действительно принял ваш ответ. Я здесь относительно новичок, поэтому, возможно, я ошибаюсь, но разве зеленая галочка не указывает на то, что спрашивающий принял конкретный ответ? @Mary

4. Спасибо, да. Теперь я вижу, что это принято. Должно быть, пропустил это раньше.