David.C.J 发表于 2024-6-16 20:40:19

进行LU分解时代入初始化矩阵数据存在精度丢失

    program main
    integer,parameter::sp = selected_real_kind(15)
    real(kind=sp)::mat_1(3)
    real(kind=sp) matrix_A1(2,2)
    real(kind=sp) matrix_A(7,7),L(7,7),U(7,7)
    integer*4 n,i
    !call ieee_set_rounding_mode(ieee_nearest)       !设置浮点数的精度
    n = 7
    mat_1 = (/1.0,2.0,3.0/)
    matrix_A1 = reshape((/2.0,2.0,1.0,1.0/),(/2,2/))
    matrix_A(:,:) = 0.0d0
    matrix_A(1,1:7) =

    !matrix_A(1,1) = 1.30000000_sp!即使定义real*16后矩阵初始化的值也是存在精度丢失

    write(*,*)"sp精度位数",sp
    !write(*,"(7F13.8)") matrix_A(1,1:7)
    write(*,*)"----------输出A矩阵----------"
    write(*,"(7F13.8)") (matrix_A(i,:),i=1,7)

    pause   
    end
无论怎么修改selected_real_kind里面要求的精度,但是初始化matrix_A(1,1)得到的值都是1.29999995,而不是预期的1.30000000
单独初始化为matrix_A(1,1) = 1.30000000_sp输出的值才能是对的
那么如何保证矩阵整个赋值初始化事后 不丢失精度呢
还望大佬们指教

li913 发表于 2024-6-17 08:44:04

数字也有精度区别,matrix_A(1,1:7) = 这里等号后面都是单精度,数字末尾加 _sp .    例如 1.30000000_sp,0.09523810_sp
详细可参考视频 https://www.bilibili.com/video/BV1XD4y1S7jz?p=3

fcode 发表于 2024-6-17 15:46:10

!matrix_A(1,1) = 1.30000000_sp!即使定义real*16后矩阵初始化的值也是存在精度丢失
你这句代码写得挺好的,干嘛注释了

David.C.J 发表于 2024-6-29 22:37:19

fcode 发表于 2024-6-17 15:46
!matrix_A(1,1) = 1.30000000_sp!即使定义real*16后矩阵初始化的值也是存在精度丢失
你这句代码写得挺好 ...

我想做的是矩阵内的数值均为real*8的量,后来查到,可以采用VS编辑器的方式默认设置

David.C.J 发表于 2024-6-29 22:38:33

li913 发表于 2024-6-17 08:44
数字也有精度区别,matrix_A(1,1:7) =

这个方法不可以的,矩阵内不只是1.0_sp2.0_d0这种方法
只能采用VS编辑器设置解决
但是还是不是预期的方法
页: [1]
查看完整版本: 进行LU分解时代入初始化矩阵数据存在精度丢失