我用浮點數小精度執行算術運算時檢測到一個不尋常的計算時間。以下簡單的代碼表現出這種行爲:爲什麼一些算術運算需要比平常更多的時間?
#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.32000segs其中Y = 0.9
X = 0.000000
時間:19.99000segs
我使用一臺筆記本電腦用以下規格測試的代碼:
- CPU:英特爾®酷睿™2雙核CPU T5800 @ 2.00GHz×2
- RAM:4 GB
- OS:Ubuntu的12.04(64位)
- 型號:戴爾Studio 1535
爲什麼出現這種情況詳細有人能解釋一下嗎?我知道,在y = 0.9時,x值比y = 0.5更慢,因此我懷疑問題與此直接相關。
在第二種情況下,您可能會在達到0之前獲得更多的非正規化。 –
另請參閱[本答案](http://stackoverflow.com/a/9314926/1011995)有關非規範化的性能影響。 –