Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возведение числа в дробную степень 
:(
    Опции темы
Андракула
Дата 16.1.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!

Как ловить ошибку в C++Builder 5 при возведении отрицательного числа в степень 0,5 например?

такой try-блок поймать ее не может:

Код

double f, a, b;
...
try{
f = pow(a,b);
}
catch(...){ShowMessage("----");}


а функцию Power(double a, double) (которая вроде должна работать) не находит компайлер!


такой вариант тоже на проходит:

Код

double f, a, b;
...
try{
struct _exception err;
f = pow(a,b);
_matherr(&err);
if (err.type == DOMAIN)
ShowMessage("....!");
}
}
catch(...){ShowMessage("----");}


Как быть?
Заранее всем спасибо!
PM MAIL   Вверх
segmentation_fault
Дата 16.1.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Андракула @  16.1.2007,  15:48 Найти цитируемый пост)
а функцию Power(double a, double) (которая вроде должна работать) не находит компайлер!
 
А ты Math.h подключил?

PM MAIL   Вверх
Vyacheslav
Дата 16.1.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Андракула @  16.1.2007,  15:48 Найти цитируемый пост)
такой try-блок поймать ее не может:

А где написано, что функция генерит исключение
Цитата(C++Builder Help)

Return Value

On success, pow and powl return the value calculated of x to the power of y.

Sometimes the arguments passed to these functions produce results that overflow or are incalculable. When the correct value would overflow, the functions return the value HUGE_VAL (pow) or _LHUGE_VAL (powl). Results of excessively large magnitude can cause the global variable errno to be set to

ERANGE    Result out of range

If the argument x passed to pow or powl is real and less than 0, and y is not a whole number, or if x is 0 and y is less than 0, or you call pow(0,0), the global variable errno is set to

EDOM    Domain error

Error handling for these functions can be modified through the functions _matherr and _matherrl.





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Андракула
Дата 16.1.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Math.h подключил

про Хелп я что то не понял, я же пытался ее с _matherr поямать, но не получилось  smile 
PM MAIL   Вверх
stmamont
Дата 16.1.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подключать надо Math.hpp для работы с Power по-моему

Это сообщение отредактировал(а) stmamont - 16.1.2007, 16:31


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <math.h>
#include <iostream>
#include <errno.h>

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  double f = pow(-100,0.5);
  
  if (errno  == EDOM)
       std::cout << "Error" << std::endl;


    return 0;
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Андракула
Дата 16.1.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да с #include <math.hpp> все работает! smile 

Большое спасибо!!!
PM MAIL   Вверх
Vyacheslav
Дата 16.1.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Андракула @  16.1.2007,  16:26 Найти цитируемый пост)
про Хелп я что то не понял, я же пытался ее с _matherr поямать, но не получилось    

_matherr служит для изменения дефолтного поведения. Если хотите, что бы pow генерил исключение, то надо переопределить _matherr
Код

#include <math.h>
#include <string.h>
#include <exception>
#include <string>
#include <iostream>

int _matherr (struct _exception *a)
{
  throw std::domain_error("pow: DOMEN error");
  return 0;
}

#pragma argsused
int main(int argc, char* argv[])
{
  try {
    double f = pow(-100,0.5);
  }
  catch(std::exception& exp)
  {
      std::cout << exp.what() << std::endl;
  }
    return 0;
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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