Консультация № 110374
21.11.2007, 11:50
0.00 руб.
0 2 2
Доброго дня!
Вопрос следующий к уважаемым экспертам.Программирую на VC++ 6.0.

обьясните пожалуйста действие строки float f = 1024 / float(++i);
с остальными строками все просто и понятно.Почему во флоате можно делить на ноль и какая последовательность действий при этом проиходит?
если в чистом виде написать 0.00 то деления уже на этапе компиляции не будет.

#include <iostream>
using namespace std;

void main()
{
char i = char(255);
float f = 1024 / float(++i);
int j = 1024 / i--;
cout << j << endl;

return;
}

Обсуждение

Неизвестный
21.11.2007, 11:57
общий
это ответ
Здравствуйте, denver!

float f = 1024 / float(++i);
равносильно
i := i + 1;
float f = 1024 / float(i);
т. е. в начале происходит инкремент i, а затем его подстановка в знаменатель.

Соответственно в следующей строке (i --) - декремент происходит уже после подстановки, т. е.

int j = 1024 / i--;
равносильно
int j = 1024 / i;
i := i - 1;

Поэтому в данном примере под дробью будет число 256 в обоих строчках
Неизвестный
21.11.2007, 12:39
общий
это ответ
Здравствуйте, denver!

По умолчанию исключения при работе с плавающей точкой отключены. Т.е. при выполнении недопустимой операции, переполнении и проч. результат просто становится "не числом" - INFINITY или NAN (посмотрите в отладчике значение f после присвоения, что-то вроде -1.#INF0000, правда?).

Протестировать результат можно функциями _finite(), _isnan(), _fpclass().

Для разрешения исключений сопроцессора можно использовать _controlfp(), например добавьте в начало Вашей main() следующий код:

// Получаем флаг
int cw = _controlfp( 0, 0 );
// Разрешаем исключения
cw &=~(EM_OVERFLOW|EM_UNDERFLOW|EM_INEXACT|EM_ZERODIVIDE|EM_DENORMAL|EM_INVALID);
// Устанавливаем
_controlfp(cw, MCW_EM);

и успешно вылетите на упомянутой строчке с exception‘ом Invalid floating-point operation.

На этапе компиляции компилятор просто показывает, какой он умный, что видит очевидную нулевую константу в знаменателе оператора деления.

P.S. Упомянутые функции определены в хэдере <float.h>.

Удачи.
Форма ответа