Да подождите вы со своими кучами. Начал строить логику на SEH. В Debug конфигурации все работает норм, а вот в Release - проблемы с отлавливанием исключения при переполнении. При выполнении 1E+300 / 1E-300 приложение с треском вылетает и выкидывает message типа: "Исключение unknown software exception (0x91) в приложении по адресу...". Методом тыка и сравнения опций конфигураций Debug и Release обнаружилась опция Fast Floating Point (-ff). При её сбрасывании всё работает. Ассемблерный код деления с выключенной опцией:
fld qword ptr [ebp-$2c]
fdv qword ptr [ebp-$34]
fstep qword ptr [ebp-$3c]
wait
А с включенной опцией всё тоже самое, только без wait. В самой справке говориться, что эта опция управляет приведением типа:
Цитата:
Floating-point operations are optimized without regard to explicit or implicit type conversions. Calculations can be faster than under ANSI operating mode.
The purpose of the fast floating-point option is to allow certain optimizations that are technically contrary to correct C semantics.
double x; x = (float) (3.5*x);
To execute this correctly, x is multiplied by 3.5 to give a double that is truncated to float precision, then stores as a double in x. Under fast floating-point operation, the long double product is converted directly to a double. Since very few programs depend on the loss of precision on passing to a narrower floating-point type, fast floating point is on by default.
When this option is disabled (-ff-), the compiler follows strict ANSI rules regarding floating-point conversions.
The default is True.
Хотя в ассемблерном варианте ничего такого не наблюдается. Проблема решена. Однако, не понятно почему это решение работает. У кого-то есть объяснения?