运算优先级是指:一个表达式中同时出现多个运算时,程序默认的计算顺序。
本文代码
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
对应数学公式:
- 这行代码中同时出现了括号、复数乘法、函数调用exp()和加法。
- 计算顺序可以理解为:(0.0,1.0)=0+1i=i
- 先计算:
- 再计算:
- 最后计算:
- 括号的作用是明确告诉程序和读者:中的指数部分是整个
结果分析
- pi由计算得到,。再不厌其烦重复一边,由于使用real单精度实数,所以pi是圆周率的近似值,双精度也是近似值。
- 核心表达式eulerIdentity=exp((0.0,1.0)*pi)+1.0数学上对应
- 根据欧拉恒等式程序输出“计算结果实部和虚部=0.00000000 -0.00000009”
- 虚部不是严格的 0,而是 -0.00000009,这是浮点近似误差造成的。原因包括:pi是近似值、complex计算使用浮点数、exp()函数计算也存在数值近似,本例结果应理解为
知识点记录
- 欧拉恒等式是数学中的经典公式,把几个重要常数联系在一起
- fortran中复数字面量写作:(实部,虚部),所以(0.0,1.0)对应数学中的0+1i也就是虚数单位。
- fortran中指数函数写作:exp(x),当x是复数时,exp(x)会按复数指数函数计算。本例exp((0.0,1.0)*pi)对应数学公式:
- 另外acos(-1.0) 可以用来得到圆周率近似值:括号()可以明确表达式的计算顺序。即使程序按默认优先级也能计算,适当加括号可以让公式更清楚。
- 运行结果中的微小误差来自浮点数近似,不代表公式错误。对于实数和复数计算,程序结果通常是数学精确值的近似。