进行LU分解时代入初始化矩阵数据存在精度丢失
program maininteger,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输出的值才能是对的
那么如何保证矩阵整个赋值初始化事后 不丢失精度呢
还望大佬们指教
数字也有精度区别,matrix_A(1,1:7) = 这里等号后面都是单精度,数字末尾加 _sp . 例如 1.30000000_sp,0.09523810_sp
详细可参考视频 https://www.bilibili.com/video/BV1XD4y1S7jz?p=3 !matrix_A(1,1) = 1.30000000_sp!即使定义real*16后矩阵初始化的值也是存在精度丢失
你这句代码写得挺好的,干嘛注释了 fcode 发表于 2024-6-17 15:46
!matrix_A(1,1) = 1.30000000_sp!即使定义real*16后矩阵初始化的值也是存在精度丢失
你这句代码写得挺好 ...
我想做的是矩阵内的数值均为real*8的量,后来查到,可以采用VS编辑器的方式默认设置 li913 发表于 2024-6-17 08:44
数字也有精度区别,matrix_A(1,1:7) =
这个方法不可以的,矩阵内不只是1.0_sp2.0_d0这种方法
只能采用VS编辑器设置解决
但是还是不是预期的方法
页:
[1]