Fortran Coder

查看: 22767|回复: 14
打印 上一主题 下一主题

[数值问题] 请问双双精度变量赋值时后缀加什么?

[复制链接]

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
跳转到指定楼层
楼主
发表于 2017-8-13 10:08:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 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



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

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

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

15#
发表于 2017-11-9 15:40:41 | 只看该作者
本帖最后由 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

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
14#
 楼主| 发表于 2017-11-9 15:35:45 | 只看该作者
vvt 发表于 2017-11-9 15:06
向量,矩阵,是数学概念。
编程里只有一维数组,二维数组的概念。

我还是老实点用dot_product吧,谢谢

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
13#
发表于 2017-11-9 15:06:20 | 只看该作者
向量,矩阵,是数学概念。
编程里只有一维数组,二维数组的概念。

通常我们用一维数组表示向量,二维数组表示矩阵。(但仅仅是表示,而非相等的概念)
其实 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) ) 此时是应用内积的算法

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
12#
 楼主| 发表于 2017-11-9 13:48:55 | 只看该作者
本帖最后由 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


259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

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

QQ
11#
发表于 2017-10-25 11:18:51 | 只看该作者
dble 这个函数我从来不用。
转换成浮点数(不管精度是多少),都可以用 real 函数。

qp = real(i,8) 就可以了

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
10#
 楼主| 发表于 2017-10-25 11:06:17 | 只看该作者
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精度呢?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
9#
发表于 2017-8-14 08:23:28 | 只看该作者
的确是笔误,应该是
Integer , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP

不写 dsqrt ,直接写 sqrt 即可,它适用于任何kind值。
详解 http://whyd.w.fcode.cn

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
8#
 楼主| 发表于 2017-8-14 07:04:51 | 只看该作者
本帖最后由 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应该写成什么?

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
7#
 楼主| 发表于 2017-8-13 19:05:19 | 只看该作者
vvt 发表于 2017-8-13 16:24
是的,就像这样
Real , parameter :: QP = Selected_real_kind( 18 )
Real(Kind=QP) :: a = 3.14_QP ...

谢谢!!!!!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-24 00:50

Powered by Tencent X3.4

© 2013-2024 Tencent

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