Код:
#define TEST_SPEED_FABS_LOOPS ((U32_MAX >> 3) + bxi_randu8())
static void check_fabs_speed(void)
{
u32 i;
f64 iterator = 1.1;
f64 value = 0.0;
f64 sum_org = 0;
f64 sum_new = 0;
u32 loops = TEST_SPEED_FABS_LOOPS;
test_time_start();
{
for (i = 0; i < loops; i++)
{
iterator *= -1.5;
value += iterator;
sum_org += fabs(value - 50.0);
if (value > 1e8)
value = 0.0;
if (iterator > 1e8)
iterator = 1.1;
}
}
test_time_finish();
test_time_print("fabs");
iterator = 1.1;
value = 0.0;
test_time_start();
{
for (i = 0; i < loops; i++)
{
iterator *= -1.5;
value += iterator;
sum_new += bxi_fabs(value - 50.0);
if (value > 1e8)
value = 0.0;
if (iterator > 1e8)
iterator = 1.1;
}
}
test_time_finish();
test_time_print("bxi_fabs");
printf("%f\n%f\n", sum_org, sum_new);
if (sum_org != sum_new)
test_failed();
}
Суть кода - проверяет скорость и точность самописного fabs. Два блока кода почти идентичны, за исключением имени функции. Запускаем на Ubuntu 16.04, libc-2.23, x86_64:
24355184302566256.000000
24355184302566256.000000
24355184305680488.000000
24355184302566256.000000
if (isnan(x)) return -x;
return x > 0 ? x : -x;
В общем у меня подгорает - автоматические тесты фейлятся, система говорит что я дурак, а баг на самом деле в разработчиках Minix.
Что делать? Как это решить? Почему разный результат?