Re: [問題] int()的奇怪現象

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/02/27 13:06), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串2/4 (看更多)
※ 引述《yongtw123 (六円)》之銘言: : #include <iostream> #include <stdio.h> : #include <cmath> : #include <string> : using namespace std; union T { double d; unsigned int i[2]; }; : int main() : { : int m, x, y, z; T t; : input: : cout<<"input: "; : cin>>x>>y>>z; : cin.get(); : if (x<0) : goto input; : if (y<0) : goto input; : if (z==0) : goto input; : m = int((4.0/7)*(pow(y,1.75)-pow(x,1.75))+(8.0/z)); : cout<<m<<endl; t.d = (4.0/7)*(pow(y,1.75)-pow(x,1.75))+(8.0/z); cout<<t.d<<endl<<endl; printf("%-20.18lf = 0x%08X%08X\n", t.d, t.i[1], t.i[0]); t.d = 1.0; printf("%-20.18lf = 0x%08X%08X\n", t.d, t.i[1], t.i[0]); : system("pause"); : return(0); : } : 兩個奇怪現象: : 1. 輸入1 1 8 : 得1 : 但是輸入2 2 8 : 得0 : (兩者應該一樣的) : 2. 第三個數字輸入0 : 程式並不會跳到input重來 : PS: 加cin.get()是因為之後還要加cin.getline() : 想要請問是哪裡的問題 : 毫無頭緒... : 先感謝~ 把小弟穿插在您的code中間的程式碼加進去您的試試.... PS. 用printf是因為小弟跟cout不熟, 如果您cout用得很熟練.... 可以自行用您習慣的格式化輸出看結果應該也沒關係.... == 簡單的說結論, 精確度的問題, cout同樣輸出了1.0給你看.... 但是存在記憶體裡的那64 bits未必真正是存了1.0真正的IEEE 754表示式.... 因為cout預設輸出的小數位數, 讓它自動幫你做了四捨五入.... 小弟我用printf強制指定小數位數, 才勉強能夠凸顯它的差異來.... double的mentisa有52 bits, 換算十進位約15位的有效位數.... 所以0.(十個9), 不特別指定輸出位數四捨五入起來都像是1.... 但是只要它真的不到1, int()下去就會全部被強制捨棄小數位掉.... -- 題外話, 如果這兩組input是老師特別要求測試的.... 那這老師還滿不錯的, 馬上給您一個浮點精確問題的震撼教育:) 另外, 這種取整數化的誤差問題, 也有個簡單又常見的解法.... 這個就給您自己稍微想想看怎麼在整數化時四捨五入吧XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.66.243.96 ※ 編輯: VictorTom 來自: 61.66.243.96 (02/27 13:11) ※ 編輯: VictorTom 來自: 61.66.243.96 (02/27 13:11)

02/27 13:23, , 1F
順便給個建議, 不要太習慣於使用goto比較好^^||
02/27 13:23, 1F

02/28 09:17, , 2F
應該是根本就不要用goto
02/28 09:17, 2F

02/28 09:49, , 3F
適當的使用是可以的,但原po的使用並不算適當...XD
02/28 09:49, 3F
文章代碼(AID): #19ftJ4Pm (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19ftJ4Pm (C_and_CPP)