Fortran Coder

楼主: shrine
打印 上一主题 下一主题

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

[复制链接]

260

帖子

0

主题

0

精华

版主

World Analyser

F 币
722 元
贡献
512 点

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

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

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

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


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 点
14#
 楼主| 发表于 2017-11-9 15:35:45 | 只看该作者
vvt 发表于 2017-11-9 15:06
向量,矩阵,是数学概念。
编程里只有一维数组,二维数组的概念。

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

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

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

本版积分规则

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

GMT+8, 2024-12-26 20:51

Powered by Tencent X3.4

© 2013-2024 Tencent

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