none
C#, недопустимые математические операции RRS feed

  • Вопрос

  • Доброго времени суток.

    В среде Visual Studio 2013 (Ultimate) на языке C# при недопустимых операциях я получаю нечто вроде NaN и +/- Infinity.

    Мне эти значения не нужны, ибо проверять (на Double.IsNaN и Double.IsPositiveInfinity/Double.IsNegativeInfinity) некрасиво, громоздко, да и вообще неприятно. Перед выполнением операций я не могу предусмотреть все случаи получения таких результатов. Вопрос: как мне получать адекватные исключения, что бы их ловить и кидать в пользователя ?

    Ручная генерация исключения (throw) сопряжена с теми или иными методами проверок.

    8 декабря 2015 г. 8:32

Ответы

  • Если работаете с конкретным типом данных (double или там float), то проверяйте получаемый результат и создавайте Exception. Или перейдите на decimal, при его использовании деление на 0 вызывает Exception.
    • Помечено в качестве ответа programmist_0 8 декабря 2015 г. 16:44
    8 декабря 2015 г. 12:03
    Отвечающий

Все ответы

  • Добрый день,

    думаю стоит подумать не о том как их проверить, а о том как их исключить. Т.е. нужно проверять входные данные, а не результат на этапе вычисления.

    8 декабря 2015 г. 8:52
  • Добрый день,

    думаю стоит подумать не о том как их проверить, а о том как их исключить. Т.е. нужно проверять входные данные, а не результат на этапе вычисления.

    Мне уже предлагали такой вариант. Только есть одна проблема: в моей программе я не знаю, какая будет выполняться математическая операция (нечто вроде строкового калькулятора).

    Что бы это знать до начала вычисления - нужно написать ещё немножко кода, который будет распределять эти операции; к этому коду нужно будет добавить случаи, когда нельзя выполнять эти операции; и непосредственно перед выполнением операции проверять, можно ли делать то, что собирается делать прямо сейчас. Это гораздо не красивее этих некрасивых проверок.

    8 декабря 2015 г. 9:10
  • Тогда реализуем Шаблон проектирования Команда (Command)

    В этом случае каждая операция делает проверку своих параметров на валидность и устанавливает флаг невозможности применения операции (вызывает метод), если входные данные не верные.

    8 декабря 2015 г. 9:22
  • Добрый день.

    Тут какая штука. С целочисленными типами все просто, у них есть верхняя и нижняя граница и при ее переходе можно получать Exception (ключевое слово checked). C дробными, в связи с особенностями хранения, может произойти переполнение вверх или вниз не за счет деления на 0, а за счет, например, вычитания. Т.е. не хватает точности типа, чтобы хранить что вы там пытаетесь хранить. Поэтому здесь не Exception, а флаг, что типа там что-то есть, но оно огромное. Как вариант, либо проверки до, например по патерну описаному выше, либо проверки после, как вы и предлагаете.

    8 декабря 2015 г. 9:35
    Отвечающий
  • Тогда реализуем Шаблон проектирования Команда (Command)

    В этом случае каждая операция делает проверку своих параметров на валидность и устанавливает флаг невозможности применения операции (вызывает метод), если входные данные не верные.

    Всё это танцы с бубном, изобретения велосипедов с квадратными и треугольными колёсами.

    Я смогу получать исключения ? Если нет, то какие ещё не числовые данные я могу встретить в числах ?

    8 декабря 2015 г. 9:35
  • Всё это танцы с бубном, изобретения велосипедов с квадратными и треугольными колёсами.

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

    Если у вас стоит задача доработать как-то код, то покажите весь код.

    Если нет, то какие ещё не числовые данные я могу встретить в числах ?

    Наверное в числах вы встретите только машинное представление числа в выбранной вами точности.

    8 декабря 2015 г. 10:14
  • Всё это танцы с бубном, изобретения велосипедов с квадратными и треугольными колёсами.

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

    Если у вас стоит задача доработать как-то код, то покажите весь код.

    Если нет, то какие ещё не числовые данные я могу встретить в числах ?

    Наверное в числах вы встретите только машинное представление числа в выбранной вами точности.

    Моя программа вычисляет значения, как строковый калькулятор. Править ничего не надо.

    Синтаксическим анализом и определением порядка вычисления занимается компилятор, запускаемый каждый раз перед вычислением нового результата. Аля динамическая компиляция кода. И если "вычислительный конвейер" выполняет неадекватную операцию - то и реакция должна быть неадекватная. Другое дело - как я буду обрабатывать этот неадекватный результат. Вот я и интересуюсь: как мне получить исключение при делении на ноль ? А по идее число не должно содержать никаких строковых данных.


    8 декабря 2015 г. 10:26
  • Если работаете с конкретным типом данных (double или там float), то проверяйте получаемый результат и создавайте Exception. Или перейдите на decimal, при его использовании деление на 0 вызывает Exception.
    • Помечено в качестве ответа programmist_0 8 декабря 2015 г. 16:44
    8 декабря 2015 г. 12:03
    Отвечающий