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

作者: yanadsl (酩獄)   2014-10-31 19:06:59
開發平台(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
作者: azureblaze (AzureBlaze)   2014-10-31 19:16:00
浮點數計算誤差 請檢查誤差大小而不是直接==
作者: jfcherng (小霹靂)   2014-10-31 19:20:00
hypot, pow 的 return type 都是浮點數, 有精度的問題
作者: yanadsl (酩獄)   2014-10-31 19:27:00
所以用相減<0.1或是轉換成int再比較應該就沒問題了?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-10-31 22:22:00
不要隨便信賴int轉換。
作者: Killercat (殺人貓™)   2014-11-01 07:41:00
其實ide碰到operator==(float, float)應該要吐警告的只是目前好像沒有這種實作 XD 這一格洞太多人踩了
作者: uranusjr (←這人是超級笨蛋)   2014-11-01 18:51:00
如果吐警告那有時候真的想測完全相等時怎麼辦 XD
作者: EdisonX (卡卡獸)   2014-11-01 22:28:00
我是想知道 operator== , 對於 +-0.0 結果有沒定義 XD
作者: x000032001 (版廢了該走了)   2014-11-01 23:21:00
gcc對float的==編出來是用ucomiss算的就是
作者: Killercat (殺人貓™)   2014-11-02 12:00:00
float完全相等的定義只有一個 就是bitwise相等叫使用者去自己做bitwise equal就好了(被打老實講已use case來講 float equal根本是不合理 XD問題就在於像pow會傳equal大家卻不小心沒注意到 orz
作者: uranusjr (←這人是超級笨蛋)   2014-11-02 13:58:00
float?
作者: Killercat (殺人貓™)   2014-11-02 17:05:00
沒錯 打錯字 XD
作者: redmilk   2014-11-02 21:03:00
三邊長a, b, c, 其中a=m^2-n2, b=2mn, c=m^2+n^2m, n互質可以得到a, b, c互質的解只要把m, n用整數代入跑一圈 刪掉重復的 就不用符點數了

Links booklink

Contact Us: admin [ a t ] ucptt.com