[問題] 關於分數計算誤差的問題

看板C_and_CPP (C/C++)作者 (Lykos)時間15年前 (2011/04/11 00:22), 編輯推噓3(3038)
留言41則, 6人參與, 最新討論串1/2 (看更多)
最近剛學C++ 照著課本寫while()的習題時,有一題一直寫不成功 想請問板上前輩們,哪裡弄錯了呀? ------ Q: 有個公式在算攝氏近似值 : Celsius = 1/2 * ( Fahren - 30) 請問攝氏幾度的時候,這個攝氏的近似值會大於攝氏的實際值4呢? ------ #include <iostream> using namespace std; int main() { int fahren = 0; double acelsius = ( 1 / 2 ) * ( fahren - 30 ); double ecelsius = ( 5 / 9 ) * ( fahren - 32 ); double delta = 0.0; while(delta <= 4) { delta = (acelsius - ecelsius); cout << fahren << " "; fahren = fahren + 1; } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.172.190

04/11 00:24, , 1F
問題會不會是出在 (1/2) 跟 (5/9)...?
04/11 00:24, 1F

04/11 00:25, , 2F
置底十三誡之七. 你的ace~與ece~初始化完直都是0.0...
04/11 00:25, 2F

04/11 00:26, , 3F
先試著修改成 (1.0/2.0) 跟 (5.0/9.0) 吧
04/11 00:26, 3F

04/11 00:26, , 4F
還有你的不成功是怎樣不成功? 結果有錯?還是迴圈出不來?
04/11 00:26, 4F

04/11 00:26, , 5F
題目是不是有錯?
04/11 00:26, 5F

04/11 00:27, , 6F
初看的結果, 就算初值給對了, while大概也沒機會出來,
04/11 00:27, 6F

04/11 00:27, , 7F
我將 fah 改成 double 後,跑出來的結果仍然不成功耶@@"
04/11 00:27, 7F

04/11 00:28, , 8F
因為while裡fahren再怎樣改都改不到ace~ece~, 自然改不
04/11 00:28, 8F

04/11 00:28, , 9F
結果:1 2 3 .....無限大的連續整數
04/11 00:28, 9F

04/11 00:28, , 10F
到delta, 這個迴圈要是進得去, 就沒有出來的一天Orz
04/11 00:28, 10F

04/11 00:29, , 11F
仔細看了好幾次,還是看不懂題目的邏輯....XD
04/11 00:29, 11F

04/11 00:30, , 12F
那問題是: while迴圈出不去, 結果一路印數字印不停.
04/11 00:30, 12F

04/11 00:30, , 13F
你要講清楚不成功是怎樣不成功...~_~
04/11 00:30, 13F

04/11 00:31, , 14F
小弟我猜, 把ace~=..與ece~=..這兩行搬進while, 放在
04/11 00:31, 14F

04/11 00:31, , 15F
一個是攝氏一個是華氏
04/11 00:31, 15F

04/11 00:31, , 16F
delta=..之前, 大概就是原po要的吧....
04/11 00:31, 16F

04/11 00:32, , 17F
還有, 1/2與5/9這邊要先照3F j大的推文修對....@_@"
04/11 00:32, 17F

04/11 00:33, , 18F
雖然小弟我到現在為止都還看不懂這在算什麼XD
04/11 00:33, 18F

04/11 00:36, , 19F
是當華氏幾度時 攝氏近似值會大於實際值4
04/11 00:36, 19F

04/11 00:37, , 20F
如果是照f大說的, 看起來就比較像原po正在寫的了:)
04/11 00:37, 20F

04/11 00:38, , 21F
嗯嗯,謝謝大家>"< (我用手算,電腦沒有錯..我再把題目
04/11 00:38, 21F

04/11 00:38, , 22F
其實delta的值沒有增加XD 無限loop
04/11 00:38, 22F

04/11 00:38, , 23F
搞清楚一下@@"
04/11 00:38, 23F

04/11 00:41, , 24F
最有可能是浮點數誤差 XD
04/11 00:41, 24F

04/11 00:41, , 25F
不, 原po程式的問題在於while裡的ace~與ece~兩個變數的
04/11 00:41, 25F

04/11 00:42, , 26F
值根本就不會再變化了, 所以delta算出來的一直都是同樣
04/11 00:42, 26F

04/11 00:42, , 27F
的值. 解決方法就上面推的, 每次迴圈都要用新的fah~值計
04/11 00:42, 27F

04/11 00:43, , 28F
算出新的ace~與ece~代公式的結果, 再相減算出新delta,
04/11 00:43, 28F

04/11 00:44, , 29F
這樣while才有可能離開, 最後一個被印的fah就是答案.
04/11 00:44, 29F

04/11 00:45, , 30F
恩恩
04/11 00:45, 30F

04/11 00:45, , 31F
至於要怎樣只印出答案, 就要橋一下code的順序了XD
04/11 00:45, 31F

04/11 00:49, , 32F
ㄟ~~可是小弟用Excel跑了一下數據, 怎麼好像fah~要負得
04/11 00:49, 32F

04/11 00:50, , 33F
跑, 近似值才有機會比實際值大4啊?? 雖然看公式就有這種
04/11 00:50, 33F

04/11 00:50, , 34F
華氏初始值不能從0開始加 會 forever loop
04/11 00:50, 34F

04/11 00:51, , 35F
感覺了, fah~正得跑應該近似值只會輸實際值更多@_@"
04/11 00:51, 35F

04/11 00:51, , 36F
筆算是負值
04/11 00:51, 36F

04/11 00:52, , 37F
在-22近似會大於實際4
04/11 00:52, 37F

04/11 00:53, , 38F
小弟用Excel算也是同樣的結果; 話說我已經不記得這種數
04/11 00:53, 38F

04/11 00:53, , 39F
學要怎樣筆算了...(掩面Q_Q~)
04/11 00:53, 39F

04/11 19:20, , 40F
fahren宣告改用double試試看吧!
04/11 19:20, 40F

04/14 11:32, , 41F
標題已修改為「關於分數計算誤差的問題」
04/14 11:32, 41F
文章代碼(AID): #1DeTb2u6 (C_and_CPP)
文章代碼(AID): #1DeTb2u6 (C_and_CPP)