Fortran Coder

查看: 34205|回复: 7
打印 上一主题 下一主题

[数值问题] fortran中的种别kind以及selected_real_kind的使用

[复制链接]

7

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
20 点
跳转到指定楼层
楼主
发表于 2017-6-1 09:27:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
program test_kinds

implicit none

integer,parameter :: long=selected_real_kind(9,99)
real :: a=2.8_long

write(*,*) KIND(a)
write(*,*) long
write(*,*) precision(a)
write(*,*) range(a)
write(*,*) huge(a)

stop
end

输出结果分别为:
           4
           8
           6
          37
  3.4028235E+38
-----------------------------------------------------------
疑问:
1、KIND(a)和输出的long的数值,为什么不同?a的kind值不是通过语句real :: a=2.8_long指定的么?
2、定义的long的范围,是(9,99),为什么输出的precision和range是8和6?
3、输出的a的最大数值,不应该是10E99吗?

谢谢各位!

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

沙发
发表于 2017-6-1 10:52:37 | 只看该作者
请翻阅编译器帮助文档
The GNU Fortran Compiler: SELECTED_REAL_KIND
https://gcc.gnu.org/onlinedocs/g ... D_005fREAL_005fKIND
参考如下范例代码
[Fortran] 纯文本查看 复制代码
program real_kinds
  integer,parameter :: p6 = selected_real_kind(6)
  integer,parameter :: p10r100 = selected_real_kind(10,100)
  integer,parameter :: r400 = selected_real_kind(r=400)
  real(kind=p6) :: x
  real(kind=p10r100) :: y
  real(kind=r400) :: z

  print *, precision(x), range(x)
  print *, precision(y), range(y)
  print *, precision(z), range(z)
end program real_kind

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
板凳
发表于 2017-6-1 10:55:38 | 只看该作者
a的kind=4是由定义时决定的,而不是由其值决定。将双精度 2.8_long 赋值给a,并不会改变a的kind

7

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
20 点
地板
 楼主| 发表于 2017-6-1 22:13:42 | 只看该作者
pasuka 发表于 2017-6-1 10:52
请翻阅编译器帮助文档
The GNU Fortran Compiler: SELECTED_REAL_KIND
https://gcc.gnu.org/onlinedocs/gcc ...

看过例子明白了好多,多谢啦

7

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
20 点
5#
 楼主| 发表于 2017-6-1 22:14:57 | 只看该作者
li913 发表于 2017-6-1 10:55
a的kind=4是由定义时决定的,而不是由其值决定。将双精度 2.8_long 赋值给a,并不会改变a的kind ...

嗯,感觉有点类似整形与实行相加的时候,会有自动类型转换。这个问题中,后面数字的kind值对前面变量的kind值没有影响。多谢啦

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

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

6#
发表于 2017-6-2 08:00:20 | 只看该作者
selected_real_kind(9,99)
并不是选择恰好是精度9,幅度99的kind
计算机并没有提供这么丰富多彩的kind精度的变量类型,而只提供几种(具体因不同编译器而不同)

selected_real_kind 是选择一个,至少满足精度9,幅度99的变量类型,并且其所占内存空间最小。

7

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
20 点
7#
 楼主| 发表于 2017-6-2 08:57:56 | 只看该作者
fcode 发表于 2017-6-2 08:00
selected_real_kind(9,99)
并不是选择恰好是精度9,幅度99的kind
计算机并没有提供这么丰富多彩的kind精度 ...

嗯嗯,得到的precision(a),应该小于等于selected_real_kind返回的kind所对于的精度。
谢谢你啦。。。

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

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

8#
发表于 2017-6-2 09:32:20 | 只看该作者
precision 应该大于等于 selected_real_kind 指定的精度。
应为 selected_real_kind 的结果是“至少满足”
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-20 07:00

Powered by Tencent X3.4

© 2013-2024 Tencent

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