回 帖 发 新 帖 刷新版面

主题:lapack 中子函数的精度问题?

由于精度的需要,使用的是  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个回复)

沙发

lapack 没有支持4精度的函数.
而且real*16虽然在新版的gfortran和ivf中支持, 但性能不是慢几倍的问题.

板凳

什么问题要那么高的精度啊?
双精度已经到了上下308次方了……

3 楼

楼主的算例刚度差异那么大?连16位有效数字都无法保障?是不是可以考虑修改一下模型啊。

4 楼


要求的有效位数比较高而已,其中涉及到微分的一个程序,所以要求这样的精度。

5 楼

要不用lapack的时候转换为双精度使用. 其他地方继续使用你的四精度, 这样不知道可不可行?

6 楼

整一个lapack的源码,改改,重编译。

7 楼

把lapack和blas里的DOUBLE PRECISION全局替换成REAL*16

8 楼

[quote]把lapack和blas里的DOUBLE PRECISION全局替换成REAL*16[/quote]
董兄这倒提醒了我,是不是也可以用编译选项来解决这个问题捏:)

9 楼

[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 楼

我在想, 单精度跟双精度会不会在lapack中的算法有所微调呢. 由双精度过度到四精度是否也需要作算法的改动就不知道了. 当然直接改成四精度按理应该也能算.

我来回复

您尚未登录,请登录后再回复。点此登录或注册