Fortran Coder

查看: 90|回复: 2
打印 上一主题 下一主题

[通用算法] 进行LU分解时代入初始化矩阵数据存在精度丢失

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
9 元
贡献
3 点
跳转到指定楼层
楼主
发表于 2024-6-16 20:40:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
    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) = [1.30000000,0.09523810,0.38461538,3.00000000,6.00000000,10.00000000,6.00000000]

    !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  输出的值才能是对的
那么如何保证矩阵整个赋值初始化事后 不丢失精度呢
还望大佬们指教
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

819

帖子

2

主题

0

精华

大宗师

F 币
3862 元
贡献
2301 点
沙发
发表于 2024-6-17 08:44:04 | 只看该作者
数字也有精度区别,  matrix_A(1,1:7) = [1.30000000,0.09523810,0.38461538,3.00000000,6.00000000,10.00000000,6.00000000] 这里等号后面都是单精度,数字末尾加 _sp .    例如 1.30000000_sp,0.09523810_sp
详细可参考视频 https://www.bilibili.com/video/BV1XD4y1S7jz?p=3

1983

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1429 元
贡献
613 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2024-6-17 15:46:10 | 只看该作者
!matrix_A(1,1) = 1.30000000_sp  !即使定义real*16后矩阵初始化的值也是存在精度丢失
你这句代码写得挺好的,干嘛注释了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-26 08:35

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表