proc(int k) {
int n = 1;
float s = 1.0, w, p, q;
while (n <= k) {
w = 2.0 * n;
p = w - 1.0;
q = w + 1.0;
s = s * w * w / p / q; // 連續乘除
n++;
}
return s;
}
問題:變量 s 是 float,為什麼標準答案建議返回類型改為 double?
s * w * w / p / q 中 w 隨 n 增長(w=2n),當 k=20 時 w=40,w*w=1600,多次疊乘極易超出 float 精度甚至溢出。float 和 double,float 自動提升為 double 參與運算。float,return s; 會將 double 計算結果截斷為 float,**精度已在計算過程中喪失**,返回類型改為 double 只是保留了計算過程的高精度結果。double,除非內存/帶寬極度敏感(如嵌入式大數組、GPU 傳輸)。double 計算,返回 double;確需 float 由調用方轉換。1.0 是 double,1.0f 才是 float。代碼中 2.0、1.0 已隱式提升計算精度。double proc(int k) { // 返回 double
int n = 1;
double s = 1.0, w, p, q; // 內部也用 double
while (n <= k) {
w = 2.0 * n;
p = w - 1.0;
q = w + 1.0;
s = s * w * w / p / q;
n++;
}
return s;
}
這不是「過度設計」,而是工程嚴謹性的體現:計算精度由最薄弱環節決定,返回類型應至少等於計算精度。