声明:本博文翻译自:https://www.tutorialspoint.com/fortran/fortran_numbers.htm
前面有博文介绍过有关内容,所以这里重复的内容不在累赘。[重复内容](https://blog.csdn.net/chd_lkl/article/details/82108265)
1. 这里直接从复数的相关运算讲起。
看如下代码:
Program ComplexArithmatic
implicit none
complex, parameter :: i = (0, 1) !.. sqrt(-1)
complex :: x, y, z
x = (7, 8);
y = (5, -7)
write(*,*) i * x * y
z = x + y
write(*,'(1x,a,g0)') "z = x + y = ", z
z = x - y
write(*,'(1x,a,g0)') "z = x - y = ", z
z = x * y
write(*,'(1x,a,g0)') "z = x * y = ", z
z = x / y
write(*,'(1x,a,g0)') "z = x / y = ", z
End program ComplexArithmatic
用ivf,执行结果如下:
(9.000000,91.00000)
z = x + y = (12.00000,1.000000)
z = x - y = (2.000000,15.00000)
z = x * y = (91.00000,-9.000000)
z = x / y = (-0.2837838,1.202703)
2. 数字的范围,精度和大小
整数的范围、浮点数的精度和大小取决于分配给特定数据类型的比特数。
下表显示整数的位数和范围
Number of bits Maximum value Reason
64 9,223,372,036,854,774,807 (2**63)–1
32 2,147,483,647 (2**31)–1
下表显示了比特数、以及实数的最小值,最大值和精度。
Number of bits Largest value Smallest value Precision
64 0.8E+308 0.5E–308 15–18
32 1.7E+38 0.3E–38 6-9
下面的代码将提示报错:
Program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+40 !.. 如果想赋值成功,需要声明成kind=8
y = 3.73e+40
z = x * y
print *, z !.. 在ivf下,z为Infinity
End program rangePrecision
接下来换一个小一点的数
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+20 !.. kind=4可以满足
y = 3.73e+20
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
在ivf下执行,结果如下:
Infinity
0.4021448
可以看到,这次x,y的赋值并没有超出范围,但是z=x*y超出存储范围;而z=x/y并没有超出范围。
所以在编程中对数据范围要求比较大时,建议声明成双精度变量。
同理,当声明的变量的kind值一定时,数太小也是会出错的。
3. 类型说明符
在科学编程中,人们常常需要知道进行工作的硬件平台的数据范围和精度。
内置函数kind()允许您在运行程序之前查询硬件数据表示的详细信息。
Program kindCheck
implicit none
integer :: i
real :: r
complex :: cp
character :: c
logical :: lg
write(*,'(1x,a,g0)') 'integer ', kind(i)
write(*,'(1x,a,g0)') 'real ', kind(r)
write(*,'(1x,a,g0)') 'complex ', kind(cp)
write(*,'(1x,a,g0)') 'character ', kind(c)
write(*,'(1x,a,g0)') 'logical ', kind(lg)
End program kindCheck
在ivf下执行上面的代码,结果如下:
integer 4
real 4
complex 4
character 1
logical 4
Fortran:数字
最新推荐文章于 2023-05-15 14:00:16 发布