作者yhn0tgb60 (呦厚厚)
看板C_and_CPP
標題[問題] 遇到超級長的資料要怎麼處理???
時間Mon Feb 27 07:12:31 2017
我現在在做一個多維矩陣的行列式 用高斯消去法
因為 數值有小數 所以我會先把數值都乘到整數 並把數值的型態改成 long
因為在輾轉相除法時 明明是整數的double 還是常常會出現浮點數誤差
可能是因為誤差到overflow
所以就算我判斷他 只要 Math.abs < 0.00001 就跳出輾轉相除法
但還是會在輾轉相除法時跑無窮迴圈
我現在算這個 5x5 的矩陣行列式
11.00000 22.00000 33.00000 44.00000 55.00000
-33.00000 -55.00000 -33.00000 222.00000 444.00000
-99.00000 -777.00000 555.00000 33.00000 2345.00000
-0.00300 -444.00000 -0.77700 -0.88800 444.00000
444.00000 -333.00000 -0.00888 0.65400 0.02345
因為從小數補成整數 所以數值變很大
在計算過程中 超出了long的長度
如果是 double 應該是夠長 但是在輾轉相除法時 會跑不出迴圈
我應該用比 long 更大的型態去處理嗎??? 還是說有什麼更適當的方式解決???
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 68.206.227.13
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1488150754.A.7F6.html
推 FRAXIS: 用 Bareiss algorithm? 02/27 07:18
推 ilikekotomi: 請問是高斯消去還是輾轉相除? 兩個解的問題不同 02/27 11:38
→ ilikekotomi: 抱歉沒看清楚是要算行列式 無腦的話可以先long long 02/27 11:44
→ ilikekotomi: 如果還是會超過的話 可以用GNU的GMP來做大數運算 02/27 11:45
推 FRAXIS: 問題是在高斯消去法需要用除法 就算輸入是整數 02/27 12:03
→ FRAXIS: 中間過程會變成分數 02/27 12:04
→ FRAXIS: 如果不用大數實作有理數 就要用 Bareiss algorithm 了 02/27 12:04
→ FRAXIS: 因為 Bareiss algorithm 保證中間過程都是整數 02/27 12:05
推 Ommm5566: 看不懂 高斯消去為甚麼不能用小數???? 02/27 12:13
推 LPH66: 高斯消去法一般不能直接寫成程式, 會有數值穩定度問題 02/27 13:36
推 Ommm5566: 謝謝樓上 02/28 07:03