作者:
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
hypot, pow 的 return type 都是浮點數, 有精度的問題
作者:
yanadsl (酩獄)
2014-10-31 19:27:00所以用相減<0.1或是轉換成int再比較應該就沒問題了?
其實ide碰到operator==(float, float)應該要吐警告的只是目前好像沒有這種實作 XD 這一格洞太多人踩了
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2014-11-01 18:51:00如果吐警告那有時候真的想測完全相等時怎麼辦 XD
作者:
EdisonX (卡卡獸)
2014-11-01 22:28:00我是想知道 operator== , 對於 +-0.0 結果有沒定義 XD
gcc對float的==編出來是用ucomiss算的就是
float完全相等的定義只有一個 就是bitwise相等叫使用者去自己做bitwise equal就好了(被打老實講已use case來講 float equal根本是不合理 XD問題就在於像pow會傳equal大家卻不小心沒注意到 orz
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2014-11-02 13:58:00float?
三邊長a, b, c, 其中a=m^2-n2, b=2mn, c=m^2+n^2m, n互質可以得到a, b, c互質的解只要把m, n用整數代入跑一圈 刪掉重復的 就不用符點數了