В системах SGI с компилятором MIPSPro вы можете с большой точностью установить обработку различных исключений с плавающей запятой, используя средства sigfpe.h
.Как это бывает, деление нуля на ноль является одним из таких случаев:
#include <stdio.h>
#include <sigfpe.h>
int main (void) {
float x = 0.0f;
(void) printf("default %f / %f = %f\n", x, x, (x / x));
invalidop_results_[_ZERO_DIV_ZERO] = _ZERO;
handle_sigfpes(_ON, _EN_INVALID, 0, 0, 0);
(void) printf("handled %f / %f = %f\n", x, x, (x / x));
return 0;
}
Используется:
<code>
arkku@seven:~/test$ cc -version
MIPSpro Compilers: Version 7.3.1.3m
arkku@seven:~/test$ cc -o sigfpe sigfpe.c -lfpe
arkku@seven:~/test$ ./sigfpe
default 0.000000 / 0.000000 = nan0x7ffffe00
handled 0.000000 / 0.000000 = 0.000000
Как видите,установка результата _ZERO_DIV_ZERO
изменяет результат того же деления.Точно так же вы можете обрабатывать регулярное деление на ноль (например, если вы не хотите бесконечность в качестве результата).
Конечно, ничего из этого не является стандартным;было бы более удобно проверять NaN после каждого деления, а еще лучше проверять нули перед этим.C99 предлагает некоторый контроль над средой с плавающей точкой в fenv.h
, но я не думаю, что что-нибудь подходящее для этого доступно.В любом случае мой старый MIPSPro не поддерживает C99.