Fortran Coder

标题: 截断有效数字 [打印本页]

作者: bfjc    时间: 2025-1-22 11:46
标题: 截断有效数字
例如,双精度数字,a =1.12346789012345我想让 b 等于a的前14位有效数字,也即是b=1.123467890123
Fortran有没有函数实现这个功能啊

作者: kyra    时间: 2025-1-22 15:35
[Fortran] 纯文本查看 复制代码
real(8) :: a = 1.12346789012345d0
real(8) :: b
character(len=24) :: tmp
write(tmp,"(es22.12e3)") a
read(tmp,"(es22.12e3)") b

作者: bfjc    时间: 2025-1-22 15:54
好的,谢谢您
作者: bfjc    时间: 2025-1-22 17:01
本帖最后由 kyra 于 2025-1-22 17:12 编辑
kyra 发表于 2025-1-22 15:35
real(8) :: a = 1.12346789012345d0
real(8) :: b
character(len=24) :: tmp

您好,我想再问下
      
[Fortran] 纯文本查看 复制代码
program write_to_eff
      implicit none
      real(8) :: a
      real(8) :: b
      character(len=24) :: tmp
      
      a = 1.12346789012345d0
      
      write(tmp,"(es22.12)") a
      read(tmp,"(es22.12)") b
      write(*,*) b
      
      pause
      
      end program
执行后屏幕输出的结果是: 1.12346789012300

将程序修改,将a后面的d0去掉,如下:
      
[Fortran] 纯文本查看 复制代码
program write_to_eff
      implicit none
      real(8) :: a
      real(8) :: b
      character(len=24) :: tmp
      
      a = 1.12346789012345
      
      write(tmp,"(es22.12)") a
      read(tmp,"(es22.12)") b
      write(*,*) b
      
      pause
      
      end program

执行后屏幕输出的结果是: 1.12346792221100

因为我实际用的时候没办法加d0,但是我想要第一种输出结果
,应该怎么处理啊

作者: bfjc    时间: 2025-1-22 17:05
bfjc 发表于 2025-1-22 17:01
您好,我想再问下
      program write_to_eff
      implicit none

感觉不加d0的话,好像write是按单精度识别的,但是我定义的是双精度
作者: kyra    时间: 2025-1-22 17:11
Fortran 的常数也有精度。

对大部分编译器,默认情况下 1.12346789012345 是单精度的(默认精度)。
而 1.12346789012345d0 才是双精度的。

和 write 无关。

a 虽然是双精度,但 1.12346789012345 是单精度。把单精度的数值赋给双精度的变量,精度只有单精度。

某些编译器可以设置“默认精度”,通过一定的编译选项实现。
作者: bfjc    时间: 2025-1-22 17:23
kyra 发表于 2025-1-22 17:11
Fortran 的常数也有精度。

对大部分编译器,默认情况下 1.12346789012345 是单精度的(默认精度)。

好的,明白您的意思了,谢谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2