Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вычисление значения алгебраической функции, а что если в данной точке не опредена 
:(
    Опции темы
i_SweP
Дата 28.2.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Есть ли простой способ узнать, что функция не определена ?
Считаю значение из венгерской записи. Для + - * sin и т.д. всё понятно,
но некоторые функции имеют ограничения на параметр.
Хочется не проверять для каждой функции отдельно, входит ли передаваемое значение в её область определения.
На java я поступал просто: try считаем catch, и всё хорошо smile Есть ли такое на с++ ?
p.s. пишу в c++ builder

PM MAIL   Вверх
Alek86
Дата 28.2.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(i_SweP @  28.2.2008,  18:59 Найти цитируемый пост)
На java я поступал просто: try считаем catch, и всё хорошо

лови исключения опреационной системы - она за деление на 0 отвечает


--------------------
user posted image    user posted image
PM MAIL   Вверх
i_SweP
Дата 28.2.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата(Alek86 @  28.2.2008,  19:08 Найти цитируемый пост)
лови исключения опреационной системы - она за деление на 0 отвечает

а можно код для новичку ? (эх.. мне очень не хватает времени) 
какое именно исключение выбрасывается. 
а если например arccos(5) считаю, тоже ведь ошибка .. тоже ось отслеживает ?


Это сообщение отредактировал(а) i_SweP - 28.2.2008, 20:55
PM MAIL   Вверх
JackYF
Дата 28.2.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Возможно, дешевле поставить для тригонометрических функций свои ограничения, и проверять ОДЗ перед вызовом?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
i_SweP
Дата 2.3.2008, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата(JackYF @  28.2.2008,  21:32 Найти цитируемый пост)
Возможно, дешевле поставить для тригонометрических функций свои ограничения, и проверять ОДЗ перед вызовом?

Вот потому и спросил: в java все подобные случаи ловит ArithmeticException, так "дешевле" (всё-таки простота развращает smile )
В общем, я добавил проверку одз у всех функций, кроме возведения в степень.
Для неё обычный pow(double), но на некоторых значениях вылетает "Invalid floating point operation". Как отловить такую ошибку ?
PM MAIL   Вверх
MAKCim
Дата 2.3.2008, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



i_SweP, 
не путаем теоретическую ОДЗ и вычислительные возможности процессора
Цитата(i_SweP @  2.3.2008,  09:11 Найти цитируемый пост)
Как отловить такую ошибку ? 

перед умножением проверять на переполнение


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
i_SweP
Дата 2.3.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



MAKCim,
Я имел ввиду, что при pow() x^0.5 на отрицательных х обламывается. Есть ли другие функции для вычисления степени ?

Цитата(MAKCim @  2.3.2008,  10:24 Найти цитируемый пост)
перед умножением проверять на переполнение

об этом не подумал :( как проверить, если заранее не известно какие числа будут перемножаться ?

Это сообщение отредактировал(а) i_SweP - 2.3.2008, 10:53
PM MAIL   Вверх
MAKCim
Дата 2.3.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(i_SweP @  2.3.2008,  10:51 Найти цитируемый пост)
тоже об этом не подумал :( как проверить, если заранее не известно какие числа будут перемножаться ? 

как это неизвестно?
из ОПЗ ты получил функцию и операнды, т. е
p 0.5 ^
где p - некоторое уже вычисленное значение
которое можно анализировать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
i_SweP
Дата 2.3.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



MAKCim, 
И основание, и показатель степени неизвестны, x^0.5 - это просто пример
как перемножать - примерно в голове укладывается smile 
что-то типа 
если 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
PM MAIL   Вверх
xvr
Дата 3.3.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(i_SweP @ 2.3.2008,  11:44)
MAKCim, 
И основание, и показатель степени неизвестны, x^0.5 - это просто пример
как перемножать - примерно в голове укладывается smile 
что-то типа 
если x, y - слагаемые
a = abs(y);
t = (a >= 1) ? MAX_VALUE / a : MAX_VALUE * a; 
и тогда x должно быть <= t 

а вот что со степенью делать ..


при переполнении возникает "Invalid floating point operation", как отловить факт того, что эта ошибка возникает ?

Подмени функцию matherr
PM MAIL   Вверх
i_SweP
Дата 5.3.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата(xvr @  3.3.2008,  12:46 Найти цитируемый пост)
Подмени функцию matherr

О matherr не знал, спасибо за совет.
Однако, хотя сейчас уже не так важно, остаёся вопрос: а как переписать matherr на borland studio (2006) ?
p.s. где-то вычитал что matherr не входит в стандарт, но всё-таки.. есть способ ? на turbo c++ 3.0 smile от той же borland функция есть, и даже есть самая вменяемая к ней справка
PM MAIL   Вверх
xvr
Дата 6.3.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(i_SweP @ 5.3.2008,  22:07)
Цитата(xvr @  3.3.2008,  12:46 Найти цитируемый пост)
Подмени функцию matherr

О matherr не знал, спасибо за совет.
Однако, хотя сейчас уже не так важно, остаёся вопрос: а как переписать matherr на borland studio (2006) ?

В BCB 6.0 она есть, подозреваю, что и в 2007 тоже (только называется она там _matherr и _matherrl )
Просто берешь и делаешь у себя в программе такую функцию.

PM MAIL   Вверх
ksili
Дата 6.3.2008, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Что-то я не понял. А в С++ try и catch кто-то отменил?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
blinded
Дата 6.3.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.2.2008

Репутация: нет
Всего: нет



try/catch не отменили, просто функции из <math.h> читсый С. И об ошибке они сообщыют просто - возвращают NaN (спецю значение). Его можно проверить isnan() и если попал - смотреть errno
PM MAIL   Вверх
Lazin
Дата 6.3.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Если мне не изменяет память в билдере есть своя математическая библиотека Math, которая кидает исключение EInvalidArgument, лучше ее использовать, если конечно пишешь на билдере))
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.