Fortran Coder

查看: 255|回复: 6
打印 上一主题 下一主题

[数值问题] 截断有效数字

[复制链接]

15

帖子

6

主题

0

精华

入门

F 币
76 元
贡献
41 点
跳转到指定楼层
楼主
发表于 2025-1-22 11:46:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
例如,双精度数字,a =1.12346789012345我想让 b 等于a的前14位有效数字,也即是b=1.123467890123
Fortran有没有函数实现这个功能啊
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

264

帖子

0

主题

0

精华

版主

World Analyser

F 币
736 元
贡献
519 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2025-1-22 15:35:18 | 只看该作者
[Fortran] 纯文本查看 复制代码
real(8) :: a = 1.12346789012345d0
real(8) :: b
character(len=24) :: tmp
write(tmp,"(es22.12e3)") a
read(tmp,"(es22.12e3)") b

15

帖子

6

主题

0

精华

入门

F 币
76 元
贡献
41 点
板凳
 楼主| 发表于 2025-1-22 15:54:40 | 只看该作者
好的,谢谢您

15

帖子

6

主题

0

精华

入门

F 币
76 元
贡献
41 点
地板
 楼主| 发表于 2025-1-22 17:01:20 | 只看该作者
本帖最后由 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,但是我想要第一种输出结果
,应该怎么处理啊

15

帖子

6

主题

0

精华

入门

F 币
76 元
贡献
41 点
5#
 楼主| 发表于 2025-1-22 17:05:19 | 只看该作者
bfjc 发表于 2025-1-22 17:01
您好,我想再问下
      program write_to_eff
      implicit none

感觉不加d0的话,好像write是按单精度识别的,但是我定义的是双精度

264

帖子

0

主题

0

精华

版主

World Analyser

F 币
736 元
贡献
519 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
6#
发表于 2025-1-22 17:11:50 | 只看该作者
Fortran 的常数也有精度。

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

和 write 无关。

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

某些编译器可以设置“默认精度”,通过一定的编译选项实现。

15

帖子

6

主题

0

精华

入门

F 币
76 元
贡献
41 点
7#
 楼主| 发表于 2025-1-22 17:23:13 | 只看该作者
kyra 发表于 2025-1-22 17:11
Fortran 的常数也有精度。

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

好的,明白您的意思了,谢谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-2-5 14:49

Powered by Tencent X3.4

© 2013-2025 Tencent

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