Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
ALX2K
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 81
1

Отлов некорректных операндов в математических действиях

09.09.2016, 01:37. Просмотров 819. Ответов 3
Метки нет (Все метки)

Привет.
vb.net
1
2
3
4
5
6
7
8
        Dim x As Double = 1
        Dim y As Double = 0
        Try
            x = x / y
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        MsgBox(x.ToString)
Ошибки не возникает. Ответ равен "бесконечность".
Если посчитать корень из -2, то ответ будет какойто "NaN".
Как отловить некорректные операнды математических действий?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2016, 01:37
Ответы с готовыми решениями:

Отлов горячих клавиш
Нужно что-бы при нажатии на Enter функция возвращала true Пробовал Private...

Отлов изменений в папке
Здравствуйте. Если открыть папку в FAR-менеджере и в проводнике Windows, то...

Запрет на ввод некорректных данных
Как сделать так чтоб если пользователь не заполнил какое то поле тогда...

защита от некорректных данных в конструкторе
Здравствуйте, вот пишу довольно тривиальный класс о представлении...

Защита от ввода некорректных значений
Всем здравствуйте, решил поставить на защиту от ввода некорректных значений...

3
OwenGlendower
Супер-модератор
Эксперт .NET
9338 / 8192 / 3496
Регистрация: 17.03.2014
Сообщений: 16,261
Записей в блоге: 1
09.09.2016, 02:34 2
ALX2K, проверяй операнды перед вычислением или результат с помошью Double.IsInfinity, Double.IsNaN.

Цитата Сообщение от ALX2K Посмотреть сообщение
Ошибки не возникает. Ответ равен "бесконечность".
DivideByZeroException генерируется только для целых чисел.

Цитата Сообщение от ALX2K Посмотреть сообщение
Если посчитать корень из -2, то ответ будет какойто "NaN".
NaN => Not A Number => Не Число. Это специальное значение числовых типах с плавающей точкой для обозначения значения которое не является числом или, проще говоря, представляет результат неверной математической операции как извлечение квадратного корня из отрицательного числа.
3
ALX2K
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 81
10.09.2016, 01:11  [ТС] 3
OwenGlendower, так проверять или я путаю?
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            MsgBox(Calc("/", 1, 0).ToString)
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
        Try
            MsgBox(Calc("sqrt", -2).ToString)
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
        Try
            MsgBox(Calc("*", 1.0E+300, 1.0E+300).ToString)
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub
    Private Function Calc(ByVal op As String, ByVal x1 As Double, Optional ByVal x2 As Double = 0) As Double
        Select Case op
            Case "*"
                x1 = x1 * x2
            Case "/"
                If x2 = 0 Then Throw New DivideByZeroException
                x1 = x1 / x2
            Case "sqrt"
                If x1 < 0 Then Throw New NotFiniteNumberException
                x1 = Math.Sqrt(x1)
        End Select
        If Double.IsInfinity(x1) Or Double.IsNaN(x1) Then Throw New OverflowException
        Return x1
    End Function
0
OwenGlendower
Супер-модератор
Эксперт .NET
9338 / 8192 / 3496
Регистрация: 17.03.2014
Сообщений: 16,261
Записей в блоге: 1
10.09.2016, 07:32 4
Лучший ответ Сообщение было отмечено ALX2K как решение

Решение

ALX2K, примерно так. Проверка на IsNaN, IsInfinity избыточна т.к. ты уже проверил операнды, но её можно оставить если планируется расширение списка операций. Второй момент это выбранные исключения. Вместо NotFiniteNumberException и OverflowException я бы использовал InvalidOperationException.
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Function Calc(ByVal op As String, ByVal x1 As Double, Optional ByVal x2 As Double = 0) As Double
    Select Case op
        Case "*"
            x1 = x1 * x2
        Case "/"
            If x2 = 0 Then Throw New DivideByZeroException
            x1 = x1 / x2
        Case "sqrt"
            If x1 < 0 Then Throw New InvalidOperationException("It it prohibited to take a square root of a negative number")
        x1 = Math.Sqrt(x1)
    End Select
    If Double.IsInfinity(x1) OrElse Double.IsNaN(x1) Then Throw New InvalidOperationException
    Return x1
End Function
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2016, 07:32

GUI: Проверка на ввод некорректных данных
как сделать чтобы в поле edit можно было вводить только числовые значения? при...

Задание о действиях процессора
1. Записать пошагово действия процессора при выполнении следующей инструкции....

Delphi, защита от некорректных действий пользователя, не работает
Начали изучать Delphi таким образом: набираем код из распечаточки с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru