Fortran Coder

标题: 请问双双精度变量赋值时后缀加什么? [打印本页]

作者: shrine    时间: 2017-8-13 10:08
标题: 请问双双精度变量赋值时后缀加什么?
本帖最后由 shrine 于 2017-8-13 10:30 编辑

双精度变量赋值时,后缀加d
real(8)::a=16.d0

请问双双精度赋值时后缀加什么
real(16)::b

不加后缀的话会出现如下错误

[Fortran] 纯文本查看 复制代码
      program main
      implicit none
      real(16)::a
      real(8)::b
      real(8)::c
      
      a=1.2d0
      b=1.2d0
      c=1.2
      
      write(*,*)a
      write(*,*)b
      write(*,*)c
      end




作者: chiangtp    时间: 2017-8-13 15:22
0. 請參考: scientific-natation.pdf (96.97 KB, 下载次数: 24)
1. 請研讀網站教學視頻
2. 如果意猶未盡: chap-11 [Type Parameters].pdf (1.37 MB, 下载次数: 26)


作者: shrine    时间: 2017-8-13 15:41
本帖最后由 shrine 于 2017-8-13 15:43 编辑

刚刚在intel的论坛得到了答案,应该是
[Fortran] 纯文本查看 复制代码
real(16)::a
a=1.2_16


好像看不清,就是数值后面加个下划线
谢谢楼上


作者: chiangtp    时间: 2017-8-13 15:49
"下划线"後的number名為kind number, "literal"形式的kind number是compiler dependent, 不建議使用
作者: shrine    时间: 2017-8-13 16:00
本帖最后由 shrine 于 2017-8-13 16:02 编辑
chiangtp 发表于 2017-8-13 15:49
"下划线"後的number名為kind number, "literal"形式的kind number是compiler dependent, 不建議使用 ...

推荐使用先定义个常量selected_real_kind,然后下划线后面跟一个常量?
作者: vvt    时间: 2017-8-13 16:24
是的,就像这样
Real , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP
作者: shrine    时间: 2017-8-13 19:05
vvt 发表于 2017-8-13 16:24
是的,就像这样
Real , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP ...

谢谢!!!!!
作者: shrine    时间: 2017-8-14 07:04
本帖最后由 shrine 于 2017-8-14 08:05 编辑
vvt 发表于 2017-8-13 16:24
是的,就像这样
Real , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP ...

Integer , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP ...

笔误
相应的,dsqrt应该写成什么?

作者: vvt    时间: 2017-8-14 08:23
的确是笔误,应该是
Integer , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP

不写 dsqrt ,直接写 sqrt 即可,它适用于任何kind值。
详解 http://whyd.w.fcode.cn
作者: shrine    时间: 2017-10-25 11:06
vvt 发表于 2017-8-14 08:23
的确是笔误,应该是
Integer , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP ...

整数转化成QP精度的实数用什么符号?

比如i是整数
dble(i)是双精度

把i转成QP精度呢?
作者: kyra    时间: 2017-10-25 11:18
dble 这个函数我从来不用。
转换成浮点数(不管精度是多少),都可以用 real 函数。

qp = real(i,8) 就可以了
作者: shrine    时间: 2017-11-9 13:48
本帖最后由 shrine 于 2017-11-9 14:21 编辑
kyra 发表于 2017-10-25 11:18
dble 这个函数我从来不用。
转换成浮点数(不管精度是多少),都可以用 real 函数。

感谢一直以来的帮助
再请教一个语法问题,行向量和矩阵中的一列相乘难道不是一个数么
为何这段代码说c的形状不对呢
[Fortran] 纯文本查看 复制代码
       
program main
      implicit none
      integer::a(2,2),b(1,2),c
      a(1,1)=1
      a(2,1)=2
      a(1,2)=5
      a(2,2)=6
      b(1,1)=3
      b(1,2)=4
      c=matmul(b,a(:,1))
      end



作者: vvt    时间: 2017-11-9 15:06
向量,矩阵,是数学概念。
编程里只有一维数组,二维数组的概念。

通常我们用一维数组表示向量,二维数组表示矩阵。(但仅仅是表示,而非相等的概念)
其实 1*N 的二维数组,也可以表示向量。
matmul,必须对两个“二维数组”进行,并且结果也是二维数组(哪怕是1*1的二维数组呢)。显然,a(:,1) 是一维数组。(而 a(:,1:1)却是二维数组)

因此,你的选择可以是:
1. 改用 integer c(1,1) ; c = matmul( b , a(:,1:1) )
2. 改用 c = dot_product( b(1,:) , a(:,1) ) 此时是应用内积的算法
作者: shrine    时间: 2017-11-9 15:35
vvt 发表于 2017-11-9 15:06
向量,矩阵,是数学概念。
编程里只有一维数组,二维数组的概念。

我还是老实点用dot_product吧,谢谢
作者: pasuka    时间: 2017-11-9 15:40
本帖最后由 pasuka 于 2017-11-9 15:42 编辑
shrine 发表于 2017-11-9 13:48
感谢一直以来的帮助
再请教一个语法问题,行向量和矩阵中的一列相乘难道不是一个数么
为何这段代码说c的形 ...
首先,翻阅gfortran帮助文档
https://gcc.gnu.org/onlinedocs/g ... /MATMUL.html#MATMUL
MATMUL — matrix multiplication
Description:
Performs a matrix multiplication on numeric or logical arguments.
Standard:
Fortran 95 and later
Class:
Transformational function
Syntax:
RESULT = MATMUL(MATRIX_A, MATRIX_B)
Arguments:
MATRIX_A        An array of INTEGER, REAL, COMPLEX, or LOGICAL type, with a rank of one or two.
MATRIX_B        An array of INTEGER, REAL, or COMPLEX type if MATRIX_A is of a numeric type; otherwise, an array of LOGICAL type. The rank shall be one or two, and the first (or only) dimension of MATRIX_B shall be equal to the last (or only) dimension of MATRIX_A.
Return value:
The matrix product of MATRIX_A and MATRIX_B. The type and kind of the result follow the usual type and kind promotion rules, as for the * or .AND. operators.

显然根据文档不难发现,输入和输出变量的rank都不会小于1,那么Fortran里面的rank又是怎么定义的呢?


接着查看rank函数
https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gfortran/RANK.html#RANK
The return value is of type INTEGER and of the default integer kind. For arrays, their rank is returned; for scalars zero is returned.

Example:
[Fortran] 纯文本查看 复制代码
program test_rank
  integer :: a
  real, allocatable :: b(:,:)
  print *, rank(a), rank(b) ! Prints:  0  2
end program test_rank






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