[問題] 直角三角形 求所有可能邊長

看板C_and_CPP (C/C++)作者 (酩獄)時間11年前 (2014/10/31 19:07), 11年前編輯推噓1(1017)
留言18則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) code::block 問題(Question): 求出長度<500的所有的直角三角形邊長可能 使用三種方式答案竟然都不一樣...... 17~19行的條件 //if(hypot(side1,side2) == hypotenuse) //if(side1*side1 + side2*side2 == hypotenuse*hypotenuse) //if(pow(side1,2) + pow(side2,2) == pow(hypotenuse,2)) 應該都符合且相同,為何執行出來的結果都不一樣? 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/OuXqAKmU -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.214.78 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1414753624.A.F1D.html

10/31 19:16, , 1F
浮點數計算誤差 請檢查誤差大小而不是直接==
10/31 19:16, 1F

10/31 19:20, , 2F
hypot, pow 的 return type 都是浮點數, 有精度的問題
10/31 19:20, 2F

10/31 19:27, , 3F
所以用相減<0.1或是轉換成int再比較應該就沒問題了?
10/31 19:27, 3F
用hypot時誤差值設到0.0001才成功,然後嘗試用int()轉換再跑卻失敗 浮點數的精度還是第一次碰到這問題OTZ ※ 編輯: yanadsl (140.115.214.78), 10/31/2014 19:43:25

10/31 22:22, , 4F
不要隨便信賴int轉換。
10/31 22:22, 4F

11/01 07:41, , 5F
其實ide碰到operator==(float, float)應該要吐警告的
11/01 07:41, 5F

11/01 07:41, , 6F
只是目前好像沒有這種實作 XD 這一格洞太多人踩了
11/01 07:41, 6F

11/01 18:51, , 7F
如果吐警告那有時候真的想測完全相等時怎麼辦 XD
11/01 18:51, 7F

11/01 22:28, , 8F
我是想知道 operator== , 對於 +-0.0 結果有沒定義 XD
11/01 22:28, 8F

11/01 23:21, , 9F
gcc對float的==編出來是用ucomiss算的就是
11/01 23:21, 9F

11/02 12:00, , 10F
float完全相等的定義只有一個 就是bitwise相等
11/02 12:00, 10F

11/02 12:01, , 11F
叫使用者去自己做bitwise equal就好了(被打
11/02 12:01, 11F

11/02 12:01, , 12F
老實講已use case來講 float equal根本是不合理 XD
11/02 12:01, 12F

11/02 12:02, , 13F
問題就在於像pow會傳equal大家卻不小心沒注意到 orz
11/02 12:02, 13F

11/02 13:58, , 14F
float?
11/02 13:58, 14F

11/02 17:05, , 15F
沒錯 打錯字 XD
11/02 17:05, 15F

11/02 21:03, , 16F
三邊長a, b, c, 其中a=m^2-n2, b=2mn, c=m^2+n^2
11/02 21:03, 16F

11/02 21:03, , 17F
m, n互質可以得到a, b, c互質的解
11/02 21:03, 17F

11/02 21:04, , 18F
只要把m, n用整數代入跑一圈 刪掉重復的 就不用符點數了
11/02 21:04, 18F
文章代碼(AID): #1KKsrOyT (C_and_CPP)
文章代碼(AID): #1KKsrOyT (C_and_CPP)