- 第一章 Fortran 语言程序设计初步
- 第二章 改变程序流程
- 第三章 循环结构
- 第四章 数据结构
- 第五章 数组
- 第六章 过程和模块
- 第七章 输入输出和文件
1.4.3 算术表达式
a) 算术运算符和运算优先级
FORTRAN 规定可以使用五种算术运算符号。它们是:
+ 表示“加”(或正号)
- 表示“减”(或负号)
* 表示“乘”
/ 表示“除”
** 表示“乘方”
请注意:乘号用“*”表示,不能写成“×”,以免与字母“X”混淆,也不能用“.”代替乘号。除号不能用“÷”号。两个运算符不能紧邻,如 A*-B 是不合法的,应写成 A*(-B)。
不同的运算符按以下优先级次序:加,减 < 乘,除 < 乘方,括号( )中优先。同一优先级的两个运算,乘方按“先右后左”,其它按“先左后右”原则。
例: x + y*z → x + (y*z)
x*y**2 → x*(y**2)
x/y/z → (x/y)/z
x**y**z → x**(y**z)
3+5-6.0*8.0/4**2 → 3+5-48.0/16.0 = 5
例: 4b 分之 a → a/(4*b) 或 a/4/b,而 a/4*b 和 a/4b 是错误的。
如无自信时可用括号( ),对运算时间几乎无影响。
b) 算术表达式的含义和表示方法
所谓表达式是指一个或多个运算的组合。它是由 Fortran 的运算符和括号将各运算元素(包括常量、变量、函数、数组元素) 连结起来的一个有值的式子。Fortran77 允许使用四种表达式,即:算术表达式,关系表达式,逻辑表达式,字符表达式。
算术表达式中各运算元素都是算术量,使用的运算符只能是算术运算符,表达式的值也是一个算术量(即数值)。例如,下面就是一个 Fortran 算术表达式: (A-B)/C**2+SIN(X+Y) 。
请注意:
(1) 由于用“/”号作为除号,因此在写除法运算式子时应加上必要的括号。
(2) 乘号不能省略,如 ,必须写成 A*SIN(X),而不能写成 ASIN(X)。
(3)Fortran 中无大、中、小括号之分,一律用小括号。
(4) 乘方按“先右后左”原则处理。
(5) 对单项运算符(如-A 中的符号) 相当于在它前面有一个运算量“0”,如:-A**2 相当于 0-A**2 而非(-A)**2。
Fortran 算术表达式的求值运算的优先次序为:① 括号 > ② 函数 > ③ ** > ④ * / > ⑤ + -,即括号内的运算级别最高,加减最低。例如,SQRT(3.*2)**2 → 。
c) 表达式运算中的类型
Fortran 中的常量和变量是分类型的,允许在不同类型的算术量(包括整型、实型、双精度、复型) 之间进行算术运算,但不允许在算术量和非算术量(如逻辑型、字符型) 之间进行算术运算。F77 作如下规定:
同类型的算术量之间运算的结果仍保持原类型。
特别要注意:两个整数相除的商也是整数。例如,5/2 的值是 2 而不等于 2.5,4**(-1) 等于 0,应写为 5**(1./3.) 而非 5**(1/3)。
如果参加运算的两个算术量为不同类型,则编译系统会自动将它们转换成同一类型后进行运算。
转换的规律是:将低级类型转换成高级类型。类型的级别如下:整型(低)→实型(高)。类型的转换是从左向右进行的,在遇到不同类型的算术量时才进行转换。例如:1/2*1.0 等于 0,而 1./2*1 对于 0.5。
d) 运算的误差
整型量的运算是准确的,没有任何误差(只要在整数范围内)。而实型量的运算会出现一些误差。例如:11111.1×1111.11 本应得 12345654.321,但由于受实数有效位数的限制,只能得到 12345654.0。又如:0.001+1246825.0-1246820.0 本应得 5.001。但由于有效位数的限制,也将产生误差。[ e_143_01.f90 ] 为减小误差,在写表达式时应尽量使每一次运算结果都在有效位数范围之内,尽量不要使两个相差很大的数值直接相加或相减。在判断两个实数是否相等时,要特别慎重,最好改为判断,即 A 和 B 之差的绝对值如果小于
(
为一个很小的数,如 10-10),则认为 A 和 B 相等。
总之,在实数运算中应充分考虑到其可能出现的误差,而且在运算过程中误差会不断积累而增大,有时可能达到一个可观的程度。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论