在以下(天真)方法的實作中pow(x, n),完全忽略任何優化方法,我發現以下問題:
public double pow(double x, int n) {
boolean negative = n < 0;
long power = Math.abs(n);
double ans = 1.0;
for(long i = 0; i < power; i ) {
ans = ans * x;
}
return negative ? 1.0/ans: ans;
}
在這里,我假設對于負指數的情況,我只需計算x^n然后回傳1/(x^n),因為例如2^(-3) = 1/(2^3)
問題:
代碼在以下情況下失敗:
pow(2.00000, -2147483648)
輸出是1.00000而預期的正確結果是0.00000
如果我將代碼更改如下:
public double pow(double x, int n) {
long power = n;
if(power < 0) {
x = 1 / x;
power = -power;
}
double ans = 1.0;
for(long i = 0; i < power; i ) {
ans = ans * x;
}
return ans;
}
結果是正確的!
那么做這些方法有什么區別呢?我期望它們是等效的,但它們不是
uj5u.com熱心網友回復:
Math.abs(n)仍然是 a int,只有在之后才被分配給 a ,因此,又是waslong的絕對值(這在的檔案中有說明)。使用負邊界,回圈不執行迭代。-2147483648-2147483648Math.abs(int)
Math.abs((long)n)將解決該問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471190.html
上一篇:KMP和Rabin-Karp滑動視窗演算法是否用于模式匹配?
下一篇:不平衡二叉搜索樹中的搜索操作
