1樓:
#明明知道出題人想問什麼偏不這樣答系列
float/double精度不夠的時候使用__float128就行。
inline
__float128
Sqrt
(__float128x)
void
(__float128x,
intK=50
)inty=
0,t;
while(x
>=1)
x*=0.1Q,++
y;if(
!y)printf
("0."
);for
(inti=
1;i<=
max(y,
K);++i
)printf("
\n");}
intmain
()輸出:
p.s. 手寫一些函式的原因是不想裝其他庫了...
2樓:
求根公式是
但在 ac 的絕對值相比 b 很小的時候,上面的 與 b 就會很接近,做減法時會產生較大的精度損失。這是典型的在數值計算中需要避免的「值接近的數相減」的情況。
既然問題出在浮點計算誤差造成精度不穩定,解決辦法自然是改用數值穩定的演算法。也就是通過等價變換,避免這種「值接近的數相減」的情況。
為此如果查成熟的文獻,如 NUMERICAL RECIPES [1] 就可以找到穩定的求根公式。定義:
於是有及
這個公式中符號函式的作用就是讓 b 總和判別式同號相加,而不是相減。
其實,用原來的求根公式也一樣,通過判斷符號要求出乙個低誤差的根後,利用韋達定理(根與係數關係)求出另一根即可。這也就是
Milo Yip 引用維基百科上的做法。
除了這種使用符號函式判斷的求根方式,還有一種方式是利用等價變換
得到其中乙個根
其中第乙個等號後是函式定義,第二個等號後的比較技巧的變形演算法是數值穩定的,可以正確處理 x 絕對值很小的情況。另乙個根同樣用韋達定理求出。
採用這種技巧不僅可以避免使用符號函式,而且方便處理係數為複數的情況——顯然 b 是虛數時再計算其正負號就無意義了。不過仍然需要單獨處理 b=0 的情形。
當然,如果是寫通用的二次方程求根函式,還要考慮二次係數為零造成方程退化特例,複雜的分支是避免不了的。
這裡給出用上面另一公式的解法(把 double 改成 float,數字常量 1.0 改成 1.0f 等,也是可以的):
#include
#include
#include
using
std::
complex
;complex
>sqrt1pxm1 (complex >x)// 返回根的個數和兩個復根 std:: tuple complex >,complex >>quadratic_roots (complex >a,complex >b,complex >c)elseif( c==0.0) else }elseif( b==0.0) else }void test_quadratic_roots (complex >a,complex >b,complex >c)}std ::cout < endl;} intmain(), ,);// 復係數 3樓:靈劍 主要的問題是根本沒有一種內建的型別能處理這個精度,常用的double連表示出10^20+1與10^20的差異都做不到。除了用高精度的decimal型別強行算(一般這種型別可能不支援指數、正余弦之類的,需要自己實現)以外,可以在某個點附近,將兩個根展成微分近似的形式,從而解 x^2 + (10^20 + 1 + c)x + 10^20 = 0這一類的二次方程。 熊起 給初學程式設計的人講物件導向,非常容易出現這種誤解,這不怪學生怪老師。軟體工程的隱藏公開是對開發者講,具體說就是某個模組某個類的維護者 但以自然思維配合物件導向ABC很容易把隱藏公開理解成某個object的許可權。 賀可夫 string getinfo 其實完整的解釋是string getin... 勝勳 有必要這麼複雜嗎?直接3層for不就OK?include inta,b c int main 答案有4組 公雞,母雞,小雞 0,25,75 4,18,78 8,11,81 12,4,84 者也 百錢買百雞是個經典數學問題。最常見解法是窮舉法。即採用三重迴圈或二重迴圈對取值範圍內的數值一一驗證。... momocat 分兩頭說。一方面安排候選人,讓其安心落座,填寫應聘資料。另一方面盡快與面試官取得聯絡。如果面試官回覆會晚點到,那就安撫候選人,讓其耐心等待。這時人力資源部門可以將公司的對外宣傳資料給其翻閱,並簡單的介紹一下公司情況,如果可以的話帶對方參觀一下公司,效果更好。如果面試官仍然沒有回覆或確...c 菜鳥關於上課一道例題中private的疑問,求解惑?
C語言的一道填空題,是怎麼理解的?
一道關於人力招聘的情景模擬題,面試官無法到場該怎麼辦