Я обнаружил необычное вычислительное время при выполнении арифметических операций с плавающими числами малой точности. Следующий простой код демонстрирует это поведение:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
const int MAX_ITER = 100000000;
int main(int argc, char *argv[]){
double x = 1.0, y;
int i;
clock_t t1, t2;
scanf("%lf", &y);
t1 = clock();
for (i = 0; i < MAX_ITER; i++)
x *= y;
t2 = clock();
printf("x = %lf\n", x);
printf("Time: %.5lfsegs\n", ((double) (t2 - t1)) / CLOCKS_PER_SEC);
return 0;
}
Вот два разных прогона программы:
-
С y = 0,5
x = 0.000000
Время: 1.32000сек. -
С y = 0,9
x = 0.000000
Время: 19.99000segs
Я использую ноутбук со следующими спецификациями для проверки кода:
- CPU: процессор Intel® Core ™ 2 Duo T5800 @2.00GHz × 2
- ОЗУ: 4 ГБ
- ОС: Ubuntu 12.04 (64 бит)
- Модель: Dell Studio 1535
Может ли кто-нибудь объяснить подробно, почему это происходит? Я знаю, что при y = 0,9 значение x переходит в 0 медленнее, чем при y = 0,5, поэтому я подозреваю, что проблема напрямую связана с этим.