Сообщение "sqrt: DOMAIN error"
, Как найти грабли?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.37] |
|
|
Сообщение "sqrt: DOMAIN error"
, Как найти грабли?
|
Сообщ.
#1
,
|
|
|
|
Дело в следующем: в проге есть несколько вызовов функции расчёта квадратного sqrt(...)
Время от времени при расчёте вылетает ошибка "sqrt: DOMAIN error" (то есть, говоря по русски - аргумент sqrt <= 0) и программа вываливается. естественно, сначала при всех вызовах sqrt стал проверять , что аргумент > 0 . Не помогло, пошёл дальше . При ВСЕХ вызовах sqrt поставил конструкцию вида ![]() ![]() if (diskr < 1E-30 || a == 0) MessageBox(NULL, "Задача не имеет решения", "Нет решения", MB_ICONINFORMATION); else { double x1, x2; try { x1 = (-b+sqrt(diskr))/(2*a); x2 = (-b-sqrt(diskr))/(2*a); } catch(...) { MessageBox(NULL, "Ошибка sqrt в recalcModelBtnClick()", "Ошибка sqrt()", MB_ICONERROR); x1 = x2 = -1.; } ....... } Кое где помогло, стали выскакивать поименованные ошибки. Хотя не понимаю, почему вдруг могла появиться ошибка обработки? ведь проверял же на положительное значение. Ну это ладно ещё. Всё равно лезут время от времени ошибки "sqrt: DOMAIN error" несмотря на то, что без try нет ни одного вызова sqrt. Где искать грабли ? |
|
Сообщ.
#2
,
|
|
|
|
Шурик П., может _matherr поможет в определении ошибки?
|
|
Сообщ.
#3
,
|
|
|
|
MSDN: The sqrt function returns the square-root of x. If x is negative, sqrt returns an indefinite, by default.
она возвращает ошибку, а не исключение генерит. |
|
Сообщ.
#4
,
|
|
|
|
Я обычно делаю так
![]() ![]() #include <math.h> static int matherr_id = -1; int _matherr( struct _exception *except ) { if( matherr_id == 0 ) //our spy, no message { matherr_id = except->type; //error flag (type of error) return matherr_id; //no message (return != 0) } return 0; // use the default actions //one line: //return ( matherr_id == 0 ) ? (matherr_id = except->type) : 0; } // применительно к коду автора, юзать можно так matherr_id = 0; x1 = (-b+sqrt(diskr))/(2*a); x2 = (-b-sqrt(diskr))/(2*a); if( matherr_id != 0 ) { //в matherr_id - тип ошибки (DOMAIN, SING, OVERFLOW и т.д.), можно вывести MessageBox(NULL, "Ошибка sqrt в recalcModelBtnClick()", "Ошибка sqrt()", MB_ICONERROR); x1 = x2 = -1.; } else matherr_id = -1; |
|
Сообщ.
#5
,
|
|
|
|
Sorry всем и модераторам в том числе за тиражирование темы, что-то движок форума глючит. Пишет мне SQL ошибку создания темы, а тему тем не менее создаёт. Потому я и наплодил жуткое количество тем.
Теперь по сути вопроса: просветите идиотика. Я был всю дорогу уверен, что конструкция try { Могущий вызвать сбой код } catch { Обработчик ошибок, в том числе и свой вывод сообщения об ошибке } - гарантировано подавит любое стандартное сообщение об ошибке и заменит его моим. Или я неправ? |
|
Сообщ.
#6
,
|
|
|
|
Нет, это зависит от типа ошибки.
|
|
Сообщ.
#7
,
|
|
|
|
Цитата Adil @ Нет, это зависит от типа ошибки. Как понять - будет с помощью try ... catch(...) подавлено стандартное сообщение или нет? Adil Конструкция с matherr, как я понимаю, вообще не блокирует исходное сообщение. Просто позволяет на хвост ошибки повесить ещё и своё сообщение. Или блокирует? |
|
Сообщ.
#8
,
|
|
|
|
Цитата Шурик П. @ Повторяю - это зависит от типа ошибки. Как ты мог убедится на собственном примере - для мат ошибок сообщение об ошибке не "давится".Как понять - будет с помощью try ... catch(...) подавлено стандартное сообщение или нет? Цитата Шурик П. @ А справку почитать по _matherr - слабо? Или просто попробовать, если читать лень? Или блокирует? |