主题:lapack 中子函数的精度问题?
freqent
[专家分:0] 发布于 2011-04-17 10:17:00
由于精度的需要,使用的是 real*16 的矩阵元素 ,需要调用lapack中的求解广义本征值的子函数 dspgvx(itype,jobz,rang,UPLO,dd,AP,BP,VL,VU,IL,IU,ABSTOL,mm,W,Z,LDZ,WORK,IWORK,ifail,INFO) 来求解本征值,为了精确肯定也要将dspgvx中的参量设置为real*16,即读取32位有效数子,输出32位有效数字,但是结果确实0,或者说没法算,如果改为real*8 就能得出基本正确的结果,我一直不知道怎么回事,请指教?
1. 我发现用gfortran 无法计算 real*16,所以我用的ifort
2. 若将real*16改为DOUBLE PRECISION,可以算,但是还是相当与 用real*8
回复列表 (共11个回复)
沙发
yeg001 [专家分:14390] 发布于 2011-04-17 10:47:00
lapack 没有支持4精度的函数.
而且real*16虽然在新版的gfortran和ivf中支持, 但性能不是慢几倍的问题.
板凳
dongyuanxun [专家分:7180] 发布于 2011-04-17 11:09:00
什么问题要那么高的精度啊?
双精度已经到了上下308次方了……
3 楼
cgl_lgs [专家分:21040] 发布于 2011-04-17 16:08:00
楼主的算例刚度差异那么大?连16位有效数字都无法保障?是不是可以考虑修改一下模型啊。
4 楼
freqent [专家分:0] 发布于 2011-04-20 19:38:00
要求的有效位数比较高而已,其中涉及到微分的一个程序,所以要求这样的精度。
5 楼
yeg001 [专家分:14390] 发布于 2011-04-20 23:29:00
要不用lapack的时候转换为双精度使用. 其他地方继续使用你的四精度, 这样不知道可不可行?
6 楼
cgl_lgs [专家分:21040] 发布于 2011-04-21 10:34:00
整一个lapack的源码,改改,重编译。
7 楼
dongyuanxun [专家分:7180] 发布于 2011-04-21 11:13:00
把lapack和blas里的DOUBLE PRECISION全局替换成REAL*16
8 楼
cgl_lgs [专家分:21040] 发布于 2011-04-21 12:25:00
[quote]把lapack和blas里的DOUBLE PRECISION全局替换成REAL*16[/quote]
董兄这倒提醒了我,是不是也可以用编译选项来解决这个问题捏:)
9 楼
dongyuanxun [专家分:7180] 发布于 2011-04-21 12:50:00
[quote][quote]把lapack和blas里的DOUBLE PRECISION全局替换成REAL*16[/quote]
董兄这倒提醒了我,是不是也可以用编译选项来解决这个问题捏:)[/quote]
ivf应该有/real_size:xxx /double_size:xxx 的编译开关
gfortran4.6后刚刚有real(16),不过我没见到-fdefault-real-16的编译开关
反正我也不用那么高精度的数据类型……
10 楼
yeg001 [专家分:14390] 发布于 2011-04-21 14:37:00
我在想, 单精度跟双精度会不会在lapack中的算法有所微调呢. 由双精度过度到四精度是否也需要作算法的改动就不知道了. 当然直接改成四精度按理应该也能算.
我来回复