Шаг 351 - Обработка математических ошибок в VC++ - деление на 0

Из частного разговора.
- На 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

Но весь прикол, что этот код работает только в отладочной версии. Вот те на !!! У кого есть соображения по этому поводу пишите.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 26.06.2001