Неправильная функция или неправильный язык
Вывод с "gcc 7.2.0" соответствует ожиданиям, поскольку OP скомпилирован с C ++
С выводом "intel / 2018"согласуется с принудительной компиляцией C.
С C abs(numa)
преобразует numa
в int
со значением 0, а ниже неопределенное поведение (UB)поскольку "%.17g"
ожидает double
, а не int
.
// In C UB: vvvvv------vvvvvvvvv
printf("abs(numa) %.17g \n", abs(numa));
С выходом UB "abs(numa) 2.0410903428666442e-314"
мы можем провести некоторые экспертизы.
Типичные 2.0410903428666442e-314 в двоичном равно
00000000 00000000 00000000 00000000 11110110 00111101 01001110 00101110
Это согласуется с некоторыми компиляциями C, которые проходят 32-битный int 0
, а затем printf()
извлек это, наряду с некоторым другим следующим мусором как ожидаемое double
.
Как UB, этот результат может время от времени изменяться, если вывод вообще, все же является хорошим индикатором проблемы: Скомпилируйтев C ++ или измените на fabs()
( @ dmuir ), чтобы принять абсолютное значение double
в C ++ и C.
Некоторые благодарности OP за использование "%g"
(или "%e"
) при отладке с плавающей запятой.Гораздо более информативный "%f"