我想創建一個函數來查找數字的平方根。出於調試目的,它有指示打印當前變量值。函數squareRoot
接受兩個參數,x
和t
。然後它宣佈並初始化n
和s
。 n
是加或減的數量,每次使用時減半。 s
是什麼被認爲是目前的平方根。運行時,我可以清楚地看到n
正在正確調整。但是,前四位數字正確時,s
停止更改。我使用的這個呼叫main()
:C++ double值在乘以時會丟失精度?
cout << squareRoot(1000, 10) << "\n";
這應該打印1000平方根最近的十分之一,但有兩個奇怪的事情發生了:
- 它不會在31.6停止。
- 它停在4位數!
我的理論,爲什麼它停在四位數是這樣的:在相乘,s
失去了一些精度。這是真的?如果是這樣,你能告訴我如何改正它嗎?如果沒有,這是什麼原因造成的,我該如何糾正?
我試圖通過使用另一個變量s1
來解決這個問題,這個變量會被乘數和檢查。然後s
將與同步增加n
和s1
。這不起作用,所以我回到原來的代碼。
我的代碼如下:
#include <iostream>
using namespace std;
double squareRoot(double x, int t) {
double s = 0;
double n = 0.1;
while ((s*s) <= x) {
s += n;
n *= 2;
cout << n << "\n" << s << "\n";
}
cout << "\n";
s -= n;
// Keep changing until margin of error is reached
while ((((s*s) - x) < (1/t)) || ((x - (s*s) < (1/t)))) {
// If too high, lower s
if ((s*s) <= x) {
s += n;
n /= 2;
cout << "Adding 1/2 of previous n\n";
}
// If too low, raise s
else if ((s*s) >= x) {
s -= n;
n /= 2;
cout << "Subtracting 1/2 of previous n\n";
}
cout << s << "\n" << n << "\n\n";
}
return s;
}
我運行Windows 7 64位,MSVC++ 2008速成。預先感謝您的所有答案!
您應該查找Newton-Raphson技術來尋找平方根。一旦它接近正確的值(在每次迭代中加倍有效數字的數量),它收斂得非常快。 – 2010-09-05 02:59:41
初始循環非常低效。 – 2010-09-05 03:05:15
強制鏈接:http://docs.sun.com/source/806-3568/ncg_goldberg.html不是因爲內心的微弱,而是因爲它的標題恰到好處。 – 2010-09-05 03:26:28