fortran fortran中文资料网
手气不错
Article

017.precedence_运算优先级

运算优先级是指:一个表达式中同时出现多个运算时,程序默认的计算顺序。

本文代码

program precedenceDemo
  implicit none
  real :: pi
  complex :: eulerIdentity ! 欧拉恒等式e^(i*pi)+1的计算结果
  pi=acos(-1.0)
  eulerIdentity=exp((0.0,1.0)*pi)+1.0 ! 先算括号中的i*pi,再算exp,最后加1
  print "(A)","运算优先级:"
  print "(A)","欧拉恒等式:e^(i*pi)+1=0"
  print "(A,F12.8)","pi=",pi
  print "(A,2F14.8)","计算结果实部和虚部=",eulerIdentity
end program precedenceDemo

编译运行

(base) hong@hongdeMacBook-Pro 017.precedence % gfortran examplePrecedence.f90
(base) hong@hongdeMacBook-Pro 017.precedence % ./a.out                       
运算优先级:
欧拉恒等式:e^(i*pi)+1=0
pi=  3.14159274
计算结果实部和虚部=    0.00000000   -0.00000009
(base) hong@hongdeMacBook-Pro 017.precedence % 

核心代码

eulerIdentity=exp((0.0,1.0)*pi)+1.0

对应数学公式:eiπ+1=0e^{i\pi}+1=0

  • 这行代码中同时出现了括号、复数乘法、函数调用exp()和加法。
  • 计算顺序可以理解为:(0.0,1.0)=0+1i=i
  • 先计算:iπi\pi
  • 再计算:eiπe^{i\pi}
  • 最后计算:eiπ+1e^{i\pi}+1
  • 括号的作用是明确告诉程序和读者:eiπe^{i\pi}中的指数部分是整个iπi\pi

结果分析

  • pi由arccos(1)=π\arccos(-1)=\pi计算得到,π3.14159274\pi \approx 3.14159274。再不厌其烦重复一边,由于使用real单精度实数,所以pi是圆周率的近似值,双精度也是近似值。
  • 核心表达式eulerIdentity=exp((0.0,1.0)*pi)+1.0数学上对应eiπ+1=0e^{i\pi}+1=0
  • 根据欧拉恒等式程序输出“计算结果实部和虚部=0.00000000 -0.00000009”
  • 虚部不是严格的 0,而是 -0.00000009,这是浮点近似误差造成的。原因包括:pi是近似值、complex计算使用浮点数、exp()函数计算也存在数值近似,本例结果应理解为eiπ+10e^{i\pi}+1\approx 0

知识点记录

  • 欧拉恒等式是数学中的经典公式,把几个重要常数联系在一起e, i, π, 1, 0e,\ i,\ \pi,\ 1,\ 0
  • fortran中复数字面量写作:(实部,虚部),所以(0.0,1.0)对应数学中的0+1i也就是虚数单位ii
  • fortran中指数函数写作:exp(x),当x是复数时,exp(x)会按复数指数函数计算。本例exp((0.0,1.0)*pi)对应数学公式:eiπe^{i\pi}
  • 另外acos(-1.0) 可以用来得到圆周率近似值:括号()可以明确表达式的计算顺序。即使程序按默认优先级也能计算,适当加括号可以让公式更清楚。
  • 运行结果中的微小误差来自浮点数近似,不代表公式错误。对于实数和复数计算,程序结果通常是数学精确值的近似。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注