作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1488150754.A.7F6.html
1F:推 FRAXIS: 用 Bareiss algorithm? 02/27 07:18
2F:推 ilikekotomi: 请问是高斯消去还是辗转相除? 两个解的问题不同 02/27 11:38
3F:→ ilikekotomi: 抱歉没看清楚是要算行列式 无脑的话可以先long long 02/27 11:44
4F:→ ilikekotomi: 如果还是会超过的话 可以用GNU的GMP来做大数运算 02/27 11:45
5F:推 FRAXIS: 问题是在高斯消去法需要用除法 就算输入是整数 02/27 12:03
6F:→ FRAXIS: 中间过程会变成分数 02/27 12:04
7F:→ FRAXIS: 如果不用大数实作有理数 就要用 Bareiss algorithm 了 02/27 12:04
8F:→ FRAXIS: 因为 Bareiss algorithm 保证中间过程都是整数 02/27 12:05
9F:推 Ommm5566: 看不懂 高斯消去为甚麽不能用小数???? 02/27 12:13
11F:推 LPH66: 高斯消去法一般不能直接写成程式, 会有数值稳定度问题 02/27 13:36
13F:推 Ommm5566: 谢谢楼上 02/28 07:03