Из частного разговора. - На VC сложную математику писать практически нельзя, так как VC не обрабатывает многие математические ошибки. Например, переполнение и деление на 0 для данных с плавающей точкой. А вот Fortran все это делает и поэтому вся математика написана на Fortran.
В действительности обработка ошибок деления на ноль не такая простоя. Но эта ошибка обрабатывается помощью исключительных ситуаций. Для целых чисел все просто. При делении на ноль генерируется исключительная ситуация.
#include "stdafx.h" #include "windows.h" #include "iostream.h" void main() { int i=9; try { i=i/0; // деление на 0 } catch(...) { cout << "error" << endl; } }
А вот если попробовать тип double, то этот прием не сработает.
#include "stdafx.h" #include "windows.h" #include "iostream.h" void main() { double i=9; try { i=i/0; // Ну и что ? Будет делить и Вы об этом не узнаете. } catch(...) { cout << "error" << endl; } }
По умолчанию обработка исключительных ситуаций для типов с плавающей запятой не возникает. Но ее можно включить. Для этого используется функция _controlfp.
unsigned int _controlfp ( unsigned int new, // новое значение unsigned int mask // маска );
Для того, что бы обрабатывать деление на 0 нам нужен флаг EM_ZERODIVIDE, давайте посмотрим, как нам изменить пример для обработки деления на ноль.
#include "stdafx.h" #include "windows.h" #include "iostream.h" #include "float.h" // объявление функций для данных с плавающей точкой void main() { //---------- Настройка исключительных ситуаций int status; status=_controlfp(0,0); // получаем текущее состояние status &= ~EM_ZERODIVIDE; // будет генерироваться исключение при делении на 0 _controlfp(status,MCW_EM); // установить //---------- Конец настройки исключительных ситуаций double i=9; try { i=i/0; } catch(...) { cout << "error" << endl; } }
При выполнении программа среагирует на деление на ноль.
error Press any key to continue
Но весь прикол, что этот код работает только в отладочной версии. Вот те на !!! У кого есть соображения по этому поводу пишите.