這是我的代碼:
# include <stdio.h>
float absolute(float x){
return x>0? x: (-1)*x;
}
float bisect(float a, float b){
float k = (a b)*0.5;
return k;
}
//For n>1
float find(float n, float precision){
float l=1,m=n;
float sqrt, k=bisect(l,m);
while(absolute(k*k-n)>precision){
if(k*k-n>0){
m=k;
l=l;
k=bisect(l,m);
}
else if(k*k-n<0)
{l=k;
m=m;
k=bisect(k,m);
}
}
return k;
}
int main(){
float n, precision;
scanf("%f %f", &n, &precision);
printf("%f", find(n, precision));
return 0;
}
好吧,它給了我平方根,但沒有達到我指定的精度。例如,盡管將精度設定為 0.001,但 3 的平方根是 1.734375 而不是 1.732050,這是正確的值。我花了將近一個小時試圖除錯它,現在我已經完成了。請幫助我確定代碼出錯的地方。提前致謝!
uj5u.com熱心網友回復:
您使用精度來比較k * kand n,而您想要精度 fork而不是 for k * k。
你的 while 條件應該是while (m - l > precision) { ...。這是確保k與實際值之間的差異小于的正確方法precision
uj5u.com熱心網友回復:
如果您要求精度為 0.01,而不是您在問題中所說的 0.001,您將得到 1.734375。請注意,您的精度是您在 k*kn 中接受的絕對誤差,而不是您在 sqrt(n) - k 中接受的絕對誤差。也許這就是你困惑的根源?
如果要限制結果中的絕對誤差,可以檢查 if k*k < n, then(k precision)*(k precision) >= n或 if k*k>n, then (k-precision)*(k-precision) <= n。
或者,您可以檢查 ,精度abs(n - k^2 - p^2/4) < pk在哪里p。(這與檢查 that 相同(k-p/2)^2 < n < (k p/2)^2)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/406228.html
標籤:
上一篇:實作臨時詳細日志記錄以檢測具體錯誤原因的最佳方法:分支、分叉或前處理器指令
下一篇:如果表單驗證失敗,則回傳布林值
