errno не устанавливается на EDOM для ошибки домена функции sqrt () в Windows. Он отображается правильно в Linux, но не работает в Windows (с использованием GCC 7.4) ...
#include <stdio.h>
#include <errno.h>
#include <math.h>
int main () {
double val;
errno = 0;
val = sqrt(-10);
if(errno == EDOM) {
printf("Invalid value \n");
} else {
printf("Valid value\n");
}
errno = 0;
val = sqrt(10);
if(errno == EDOM) {
printf("Invalid value\n");
} else {
printf("Valid value\n");
}
return(0);
}
Ожидаемый результат: Недействительное значение Действительное значение Фактический результат: Действительное значение Допустимое значение
errno
. Это плохая идея и сохранена только для совместимости с устаревшей хренью. Без него генерация кода для современных архитектур намного приятнее, поскольку компилятор может просто использовать инструкциюsqrt
базового оборудования (что приводит к установке несколько более разумного флага исключения ieee754 для недопустимых операндов), тогда как ему необходимо выдать дополнительный код для установитьerrno
(который ни один здравомыслящий программист не будет использовать), поэтому есть флаг компилятора-fno-math-errno
для получения нормального поведения. - person EOF   schedule 21.05.2019