標籤:wine 開源 linux complex 補丁
我發了一個wine的補丁,實現complex::pow的部分重載:http://source.winehq.org/patches/data/104267
HongQian幫我在irc上問了Piotr對這個補丁的看法,他說:
“it generally looks ok but it‘s possible to implement it with better
precision, so I‘m not sure what to think about it”
“我想了想發現,其實我們在實現complex::pow
在指數為實整數的情況下的重載的時候,沒有必要先把實整數轉換為複數的。一開始我是為了簡化補丁的難度,就建議參考最像的函數進行實現,沒有充分考慮到精度的問題。”
我去查了一些資料,發現,以前初學C\C++用pow函數的時候有點疑惑,為什麼參數int要轉化成double,以為是系統規定的,當時為了編譯能過就用了轉換了,也沒有看原始碼的想法。今天才知道,原來是考慮到那麼幾個問題(overflow、負數次冪的結果)等才用double的,而且還提高了複用,感覺設計得很好~(除了給人一點點confuse)
然後我做了測試,這是在win下的結果:
pow(complex_float= (3.14159f, 0), 3): (31.006203,0.000000)complex_translation: (31.006201,0.000000)*******************************************************pow(complex_float= (32.1234f, 0), 6): (1098826752.000000,0.000000)complex_translation: (1098826624.000000,0.000000)*******************************************************pow(complex_float= (7.12f, 0), 6): (130280.640625,0.000000)complex_translation: (130280.648438,0.000000)
*******************Now is complex_double************************************
pow(complex_double= (3.14159/2, 0), 3): (3.875775, 0.000000)double_complex_translation: (3.875775, 0.000000)*******************************************************pow(complex_double= (32.12345678, 0), 13): (38787300223012692000.000000, 0.000000)double_complex_translation: (38787300223012684000.000000, 0.000000)*******************************************************pow(complex_double= (7.12, 0), 33): (1354689579078
5450000000000000.000000, 0.000000)double_complex_translation: (13546895790785442000000000000.000000, 0.000000)*******************************************************
現在決定用用手寫的底數為複數而指數為整數次冪的pow來解決