Генерация и обработка исключений.

Модератор: Модераторы разделов

Аватара пользователя
Alagert
Сообщения: 167

Генерация и обработка исключений.

Сообщение Alagert »

Такая ситуация:

Код: Выделить всё

long long int a,n;
a = fmod(a*a,n);

(функция умножения и приведения по модулю)
В этой функции возникает переполнение, когда умножаются 2 больших числа. Как можно сгенерировать в данном случае исключение?
Если я правильно понимаю это кусок стандартного кода, в STL есть такой класс исключений overflow_error. Можно ли его здесь как нить использовать? Если да, то как?

Всем заранее спасибо.
Alagert добавил в 23.12.2004 19:10
ТОварищи, ну что никаких мыслей нет что ли?
Вообще мат операция может сама как нить генерить исключения? без доп проверок?
Born to be ROOT
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Генерация и обработка исключений.

Сообщение Jan2ary »

Если я правильно понял:

Код: Выделить всё

> man fmod
...
RETURN VALUE
       The fmod() function returns the remainder, unless y is zero, when the function fails and errno is set.
...


Еще есть try-catch...
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
Alagert
Сообщения: 167

Re: Генерация и обработка исключений.

Сообщение Alagert »

правильно.
Но переполнее вот где вылазит: а*а. Если перемножать два больших числа, то результат переваливает за 8 байт. И мне нужно отловить именно эту ситуацию. Как мне написать throw? И можно ли здесь использовать overflow_error
Born to be ROOT
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Генерация и обработка исключений.

Сообщение elide »

ну как... переполнение интов не отлавливается (в отличие от флоатов, например) просто теряется старшая часть...
проверяй руками, что оба числа не вылазят за 4 байта, тогда их произведение не будет вылазить за 8...
слава роботам!
Спасибо сказали:
Аватара пользователя
Alagert
Сообщения: 167

Re: Генерация и обработка исключений.

Сообщение Alagert »

хорошо, если я сделаю так

Код: Выделить всё

long double a,n;
a=fmod(a*a,n);

то как мне в этом случае отловить переполнение?
Born to be ROOT
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Генерация и обработка исключений.

Сообщение nercus »

(Alagert @ Пятница, 24 Декабря 2004, 0:01) писал(а):хорошо, если я сделаю так

Код: Выделить всё

long double a,n;
a=fmod(a*a,n);

то как мне в этом случае отловить переполнение?

man fetestexcept

но вообще-то:
- сама fmod() переполнения вызвать не может, т.к. результат по модулю не превышает y
- переполнение может возникнуть только в (a*a)
- для "long long" проверить переполнение - проще простого - MAX_LONGLONG==2^63: (a*a) > MAX_LONGLONG <-> |a| > sqrt(2^63) <-> |a| > 0xb504f333. То есть, если a >= 0xb504f333, то (а*а) вываливается за границы long long.
- а если отрицательные значения не нужны, то пользуй "unsigned long long" - допустимый интервал a <= 0xffffffff
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
Alagert
Сообщения: 167

Re: Генерация и обработка исключений.

Сообщение Alagert »

Про то где вылазит переполнее я знал.
Огромное спасибо про 3 пункт. Очень помогло.
Born to be ROOT
Спасибо сказали: