![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| i_SweP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 23.6.2007 Репутация: нет Всего: нет |
Есть ли простой способ узнать, что функция не определена ?
Считаю значение из венгерской записи. Для + - * sin и т.д. всё понятно, но некоторые функции имеют ограничения на параметр. Хочется не проверять для каждой функции отдельно, входит ли передаваемое значение в её область определения. На java я поступал просто: try считаем catch, и всё хорошо p.s. пишу в c++ builder |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
лови исключения опреационной системы - она за деление на 0 отвечает |
|||
|
||||
| i_SweP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 23.6.2007 Репутация: нет Всего: нет |
а можно код для новичку ? (эх.. мне очень не хватает времени) какое именно исключение выбрасывается. а если например arccos(5) считаю, тоже ведь ошибка .. тоже ось отслеживает ? Это сообщение отредактировал(а) i_SweP - 28.2.2008, 20:55 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Возможно, дешевле поставить для тригонометрических функций свои ограничения, и проверять ОДЗ перед вызовом?
|
|||
|
||||
| i_SweP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 23.6.2007 Репутация: нет Всего: нет |
Вот потому и спросил: в java все подобные случаи ловит ArithmeticException, так "дешевле" (всё-таки простота развращает В общем, я добавил проверку одз у всех функций, кроме возведения в степень. Для неё обычный pow(double), но на некоторых значениях вылетает "Invalid floating point operation". Как отловить такую ошибку ? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
i_SweP,
не путаем теоретическую ОДЗ и вычислительные возможности процессора перед умножением проверять на переполнение -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| i_SweP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 23.6.2007 Репутация: нет Всего: нет |
MAKCim,
Я имел ввиду, что при pow() x^0.5 на отрицательных х обламывается. Есть ли другие функции для вычисления степени ? об этом не подумал :( как проверить, если заранее не известно какие числа будут перемножаться ? Это сообщение отредактировал(а) i_SweP - 2.3.2008, 10:53 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
как это неизвестно? из ОПЗ ты получил функцию и операнды, т. е p 0.5 ^ где p - некоторое уже вычисленное значение которое можно анализировать -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| i_SweP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 23.6.2007 Репутация: нет Всего: нет |
MAKCim,
И основание, и показатель степени неизвестны, x^0.5 - это просто пример как перемножать - примерно в голове укладывается что-то типа если x, y - слагаемые a = abs(y); t = (a >= 1) ? MAX_VALUE / a : MAX_VALUE * a; и тогда x должно быть <= t а вот что со степенью делать .. при переполнении возникает "Invalid floating point operation", как отловить факт того, что эта ошибка возникает ? Это сообщение отредактировал(а) i_SweP - 2.3.2008, 22:52 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Подмени функцию matherr |
|||
|
||||
| i_SweP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 23.6.2007 Репутация: нет Всего: нет |
О matherr не знал, спасибо за совет. Однако, хотя сейчас уже не так важно, остаёся вопрос: а как переписать matherr на borland studio (2006) ? p.s. где-то вычитал что matherr не входит в стандарт, но всё-таки.. есть способ ? на turbo c++ 3.0 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В BCB 6.0 она есть, подозреваю, что и в 2007 тоже (только называется она там _matherr и _matherrl ) Просто берешь и делаешь у себя в программе такую функцию. |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Что-то я не понял. А в С++ try и catch кто-то отменил?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| blinded |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 16.2.2008 Репутация: нет Всего: нет |
try/catch не отменили, просто функции из <math.h> читсый С. И об ошибке они сообщыют просто - возвращают NaN (спецю значение). Его можно проверить isnan() и если попал - смотреть errno
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Если мне не изменяет память в билдере есть своя математическая библиотека Math, которая кидает исключение EInvalidArgument, лучше ее использовать, если конечно пишешь на билдере))
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |