(функция умножения и приведения по модулю)
В этой функции возникает переполнение, когда умножаются 2 больших числа. Как можно сгенерировать в данном случае исключение?
Если я правильно понимаю это кусок стандартного кода, в STL есть такой класс исключений overflow_error. Можно ли его здесь как нить использовать? Если да, то как?
Всем заранее спасибо. Alagert добавил в 23.12.2004 19:10
ТОварищи, ну что никаких мыслей нет что ли?
Вообще мат операция может сама как нить генерить исключения? без доп проверок?
правильно.
Но переполнее вот где вылазит: а*а. Если перемножать два больших числа, то результат переваливает за 8 байт. И мне нужно отловить именно эту ситуацию. Как мне написать throw? И можно ли здесь использовать overflow_error
ну как... переполнение интов не отлавливается (в отличие от флоатов, например) просто теряется старшая часть...
проверяй руками, что оба числа не вылазят за 4 байта, тогда их произведение не будет вылазить за 8...
но вообще-то:
- сама 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 | ДДТ