控制和查询当前数值模型#
指数#
名称#
exponent(3) - [MODEL_COMPONENTS] 浮点数的指数
概要#
result = exponent(x)
elemental integer function exponent(x)
real(kind=**),intent(in) :: x
特性#
x 应为任何有效种类的实型
结果为默认的整数类型
描述#
exponent(3) 返回x的指数部分的值,前提是指数在默认整数的范围内。
选项#
- x
要查询其指数的值
结果#
exponent(3) 返回x的指数部分的值
如果x为零,则返回值为零。
如果x是 IEEE 无穷大或 NaN,则结果值为 HUGE(0)。
示例#
示例程序
program demo_exponent
implicit none
real :: x = 1.0
integer :: i
i = exponent(x)
print *, i
print *, exponent(0.0)
print *, exponent([10.0,100.0,1000.0,-10000.0])
print *, 2**[10.0,100.0,1000.0,-10000.0]
print *, exponent(huge(0.0))
print *, exponent(tiny(0.0))
end program demo_exponent
结果
> 4 7 10 14
> 128
> -125
标准#
Fortran 95
另请参阅#
digits(3), epsilon(3), fraction(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang 内联函数描述
分数部分#
名称#
fraction(3) - [MODEL_COMPONENTS] 模型表示的分数部分
概要#
result = fraction(x)
elemental real(kind=KIND) function fraction(x)
real(kind=KIND),intent(in) :: fraction
特性#
x 为实型
结果与参数具有相同的特性。
描述#
fraction(3) 返回x的模型表示的分数部分。
选项#
- x
要查询的值
结果#
返回x的模型表示的分数部分;它等于x * radix(x)**(-exponent(x))。
如果x的值为零,则结果为零。
如果x是 IEEE NaN,则结果为该 NaN。
如果x是 IEEE 无穷大,则结果为 IEEE NaN。
示例#
示例程序
program demo_fraction
implicit none
real :: x
x = 178.1387e-4
print *, fraction(x), x * radix(x)**(-exponent(x))
end program demo_fraction
结果
0.5700439 0.5700439
标准#
Fortran 95
另请参阅#
digits(3), epsilon(3), exponent(3), huge(3), maxexponent(3), minexponent(3), nearest(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang 内联函数描述
最接近的数#
名称#
nearest(3) - [MODEL_COMPONENTS] 最接近的可表示数
概要#
result = nearest(x, s)
elemental real(kind=KIND) function nearest(x,s)
real(kind=KIND),intent(in) :: x
real(kind=**),intent(in) :: s
特性#
x 可以是任何种类的实型值。
s 可以是任何种类的实型值。
返回值与x具有相同的类型和种类。
指定为 ** 的种类可以是类型支持的任何种类
描述#
nearest(3) 返回处理器可表示的、在由s的符号指示的方向上最接近x的数。
选项#
- x
要查找其最接近可表示值的值
- s
一个非零值,其符号用于确定从x到可表示值的搜索方向。
如果s为正,则nearest返回大于x且最接近它的处理器可表示数。
如果s为负,则nearest返回小于x且最接近它的处理器可表示数。
结果#
返回值与x的类型相同。如果s为正,则nearest返回大于x且最接近它的处理器可表示数。如果s为负,则nearest返回小于x且最接近它的处理器可表示数。
示例#
示例程序
program demo_nearest
implicit none
real :: x, y
x = nearest(42.0, 1.0)
y = nearest(42.0, -1.0)
write (*,"(3(g20.15))") x, y, x - y
! write (*,"(3(g20.15))") &
! nearest(tiny(0.0),1.0), &
! nearest(tiny(0.0),-1.0), &
! nearest(tiny(0.0),1.0) -nearest(tiny(0.0),-1.0)
! write (*,"(3(g20.15))") &
! nearest(huge(0.0),1.0), &
! nearest(huge(0.0),-1.0), &
! nearest(huge(0.0),1.0)- nearest(huge(0.0),-1.0)
end program demo_nearest
结果
42.0000038146973 41.9999961853027 .762939453125000E-05
标准#
Fortran 95
另请参阅#
digits(3), epsilon(3), exponent(3), fraction(3), huge(3), maxexponent(3), minexponent(3), precision(3), radix(3), range(3), rrspacing(3), scale(3), set_exponent(3), spacing(3), tiny(3)
fortran-lang 内联函数描述
相对间距的倒数#
名称#
rrspacing(3) - [MODEL_COMPONENTS] 数值类型的相对间距的倒数
概要#
result = rrspacing(x)
elemental real(kind=KIND) function rrspacing(x)
real(kind=KIND),intent(in) :: x
特性#
x 为任何种类的实型
返回值与x具有相同的类型和种类。
描述#
rrspacing(3) 返回靠近x的模型数的相对间距的倒数。
选项#
- x
应为实型。
结果#
返回值与x的类型和种类相同。返回值等于abs(fraction(x)) * float(radix(x))**digits(x)。
标准#
Fortran 95
另请参阅#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内联函数描述
scale#
名称#
scale(3) - [MODEL_COMPONENTS] 将实数值按基数的整数次幂进行缩放
概要#
result = scale(x, i)
elemental real(kind=KIND) function scale(x, i)
real(kind=KIND),intent(in) :: x
integer(kind=**),intent(in) :: i
特征#
x 为任意类型的实数
i 为任意类型的整数
结果为与x相同类型的实数
描述#
scale(3) 返回 x * radix(x)**i。
平台的基数几乎可以肯定为二,因此scale(3) 通常与x*2**i相同。
选项#
- x
要乘以radix(x)**i的值。其类型和种类用于确定具有其特征的值的基数,并确定结果的特征,因此必须注意返回的值在x的特征范围内。
- i
将机器的基数提升到的幂
结果#
返回值为x * radix(x)**i,假设该值可以用x的类型和种类表示。
示例#
示例程序
program demo_scale
implicit none
real :: x = 178.1387e-4
integer :: i = 5
print *, scale(x,i), x*radix(x)**i
end program demo_scale
结果
0.570043862 0.570043862
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
set_exponent#
名称#
set_exponent(3) - [MODEL_COMPONENTS] 具有指定指数的实数值
概要#
result = set_exponent(x, i)
elemental real(kind=KIND) function set_exponent(x,i)
real(kind=KIND),intent(in) :: x
integer(kind=**),intent(in) :: i
特征#
x 为实数类型
i 为整数类型
指定为 ** 的种类可以是类型支持的任何种类
返回值与x具有相同的类型和种类。
描述#
set_exponent(3) 返回一个实数,其小数部分与x相同,指数部分为i。
选项#
- x
应为实型。
- i
应为整数类型。
结果#
返回值与x具有相同的类型和种类。返回一个小数部分与x相同且指数部分为i的实数;它是fraction(x) * radix(x)**i。
如果x的值为零,则结果与x相同。
如果x是 IEEE 无穷大,则结果为 IEEE NaN。
如果x是 IEEE NaN,则结果为相同的 NaN。
示例#
示例程序
program demo_setexp
implicit none
real :: x = 178.1387e-4
integer :: i = 17
print *, set_exponent(x, i), fraction(x) * radix(x)**i
end program demo_setexp
结果
74716.7891 74716.7891
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),spacing(3),tiny(3)
fortran-lang 内联函数描述
spacing#
名称#
spacing(3) - [MODEL_COMPONENTS] 给定类型两个数字之间的最小距离
概要#
result = spacing(x)
elemental real(kind=KIND) function spacing(x)
real(kind=KIND), intent(in) :: x
特征#
x 为任意有效种类的实数类型
结果与输入参数x的类型相同。
描述#
spacing(3) 确定参数x与其相同类型最近邻数字之间的距离。
选项#
- x
应为实型。
结果#
如果x的值不为零且不是 IEEE 无穷大或 NaN,则结果的值最接近于x,对于相同类型和种类的值,假设该值是可以表示的。
否则,该值与tiny(x)相同。+ 零产生tiny(x) + IEEE 无穷大产生 IEEE Nan + 如果是 IEEE NaN,则返回该 NaN
如果有两个扩展模型值与x等距,则取绝对值较大的值。
示例#
示例程序
program demo_spacing
implicit none
integer, parameter :: sgl = selected_real_kind(p=6, r=37)
integer, parameter :: dbl = selected_real_kind(p=13, r=200)
write(*,*) spacing(1.0_sgl)
write(*,*) nearest(1.0_sgl,+1.0),nearest(1.0_sgl,+1.0)-1.0
write(*,*) spacing(1.0_dbl)
end program demo_spacing
结果
典型值……
1.1920929E-07
1.000000 1.1920929E-07
0.9999999 -5.9604645E-08
2.220446049250313E-016
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
digits#
名称#
digits(3) - [NUMERIC MODEL] 数值模型中的有效数字
概要#
result = digits(x)
integer function digits(x)
TYPE(kind=KIND),intent(in) :: x(..)
特征#
x 为整数或实数标量或数组
返回值为默认种类的整数。
描述#
digits(3) 返回x的内部模型表示的有效数字数。例如,在使用 32 位浮点表示的系统上,默认实数可能会返回 24。
选项#
- x
要查询的类型和种类的值
结果#
变量的类型和种类为x的有效数字数。
示例#
示例程序
program demo_digits
implicit none
integer :: i = 12345
real :: x = 3.143
doubleprecision :: y = 2.33d0
print *,'default integer:', digits(i)
print *,'default real: ', digits(x)
print *,'default doubleprecision:', digits(y)
end program demo_digits
结果
> default integer: 31
> default real: 24
> default doubleprecision: 53
标准#
Fortran 95
另请参见#
epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
epsilon#
名称#
epsilon(3) - [NUMERIC MODEL] Epsilon 函数
概要#
result = epsilon(x)
real(kind=kind(x)) function epsilon(x)
real(kind=kind(x),intent(in) :: x(..)
特征#
x 应为实数类型。它可以是标量或数组。
结果为与x相同类型和种类类型参数的标量。
描述#
epsilon(3) 返回浮点相对精度。它是相对于1的几乎可以忽略的数字,使得1+ little_number不等于1;或者更准确地说
real( 1.0, kind(x)) + epsilon(x) /= real( 1.0, kind(x))
可以将其视为从 1.0 到下一个最大浮点数的距离。
epsilon(3) 的一个用途是为搜索直到计算在估计值的delta范围内的算法选择delta值。
如果delta太小,则算法可能永远不会停止,因为计算小于数据类型的小数分辨率的值的总和不会发生变化。
选项#
- x
类型应为实数。
结果#
返回值与参数的类型相同。
示例#
示例程序
program demo_epsilon
use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32
implicit none
real(kind=sp) :: x = 3.143
real(kind=dp) :: y = 2.33d0
! so if x is of type real32, epsilon(x) has the value 2**-23
print *, epsilon(x)
! note just the type and kind of x matter, not the value
print *, epsilon(huge(x))
print *, epsilon(tiny(x))
! the value changes with the kind of the real value though
print *, epsilon(y)
! adding and subtracting epsilon(x) changes x
write(*,*)x == x + epsilon(x)
write(*,*)x == x - epsilon(x)
! these next two comparisons will be .true. !
write(*,*)x == x + epsilon(x) * 0.999999
write(*,*)x == x - epsilon(x) * 0.999999
! you can calculate epsilon(1.0d0)
write(*,*)my_dp_eps()
contains
function my_dp_eps()
! calculate the epsilon value of a machine the hard way
real(kind=dp) :: t
real(kind=dp) :: my_dp_eps
! starting with a value of 1, keep dividing the value
! by 2 until no change is detected. Note that with
! infinite precision this would be an infinite loop,
! but floating point values in Fortran have a defined
! and limited precision.
my_dp_eps = 1.0d0
SET_ST: do
my_dp_eps = my_dp_eps/2.0d0
t = 1.0d0 + my_dp_eps
if (t <= 1.0d0) exit
enddo SET_ST
my_dp_eps = 2.0d0*my_dp_eps
end function my_dp_eps
end program demo_epsilon
结果
1.1920929E-07
1.1920929E-07
1.1920929E-07
2.220446049250313E-016
F
F
T
T
2.220446049250313E-016
标准#
Fortran 95
另请参见#
digits(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
huge#
名称#
huge(3) - [数值模型] 类型的最大数值
概要#
result = huge(x)
TYPE(kind=KIND) function huge(x)
TYPE(kind=KIND),intent(in) :: x(..)
特征#
x 可以是任何实数或整数标量或数组,以及任何种类。
结果将是与输入x相同类型和种类的标量。
描述#
huge(3) 返回对于x的种类和类型而言,不是溢出的最大数值。
选项#
- x
x 是一个任意值,仅用于确定正在查询的标量的种类和类型。它不需要被定义,因为只使用其特征。
结果#
结果是指定类型和种类支持的最大值。
请注意,结果与输入具有相同的种类,以确保返回的值不会溢出。对结果的任何变量赋值都应考虑到这一点。
示例#
示例程序
program demo_huge
implicit none
character(len=*),parameter :: f='(i2,1x,2(i11,1x),f14.0:,1x,l1,1x,a)'
integer :: i,j,k,biggest
real :: v, w
! basic
print *, huge(0), huge(0.0), huge(0.0d0)
print *, tiny(0.0), tiny(0.0d0)
sum=0.0d0
! note subtracting one because counter is the end value+1 on exit
do i=0,huge(0)-1
sum=sum+i
enddo
write(*,*)'sum=',sum
! advanced
biggest=huge(0)
! be careful of overflow when using integers in computation
do i=1,14
j=6**i ! Danger, Danger
w=6**i ! Danger, Danger
v=6.0**i
k=v ! Danger, Danger
if(v.gt.biggest)then
write(*,f) i, j, k, v, v.eq.w, 'wrong j and k and w'
else
write(*,f) i, j, k, v, v.eq.w
endif
enddo
end program demo_huge
结果
2147483647 3.4028235E+38 1.797693134862316E+308
1.1754944E-38 2.225073858507201E-308
1 6 6 6. T
2 36 36 36. T
3 216 216 216. T
4 1296 1296 1296. T
5 7776 7776 7776. T
6 46656 46656 46656. T
7 279936 279936 279936. T
8 1679616 1679616 1679616. T
9 10077696 10077696 10077696. T
10 60466176 60466176 60466176. T
11 362797056 362797056 362797056. T
12 -2118184960 -2147483648 2176782336. F wrong for j and k and w
13 175792128 -2147483648 13060694016. F wrong for j and k and w
14 1054752768 -2147483648 78364164096. F wrong for j and k and w
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
maxexponent#
名称#
maxexponent(3) - [数值模型] 实数类型的最大指数
概要#
result = maxexponent(x)
elemental integer function maxexponent(x)
real(kind=**),intent(in) :: x
特征#
x 是任何实数种类的实数标量或数组。
结果是默认的整数标量。
描述#
maxexponent(3) 返回x类型的模型中的最大指数。
选项#
- x
用于选择要返回值的实数种类。
结果#
返回的值是查询值的种类对应的最大指数。
示例#
示例程序
program demo_maxexponent
use, intrinsic :: iso_fortran_env, only : real32,real64,real128
implicit none
character(len=*),parameter :: g='(*(g0,1x))'
print g, minexponent(0.0_real32), maxexponent(0.0_real32)
print g, minexponent(0.0_real64), maxexponent(0.0_real64)
print g, minexponent(0.0_real128), maxexponent(0.0_real128)
end program demo_maxexponent
结果
-125 128
-1021 1024
-16381 16384
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
minexponent#
名称#
minexponent(3) - [数值模型] 实数类型的最小指数
概要#
result = minexponent(x)
elemental integer function minexponent(x)
real(kind=**),intent(in) :: x
特征#
x 是任何实数种类的实数标量或数组。
结果是默认的整数标量。
描述#
minexponent(3) 返回x类型的模型中的最小指数。
选项#
- x
用于选择要返回值的实数种类。
结果#
返回的值是查询值的种类对应的最大指数。
示例#
示例程序
program demo_minexponent
use, intrinsic :: iso_fortran_env, only : &
&real_kinds, real32, real64, real128
implicit none
real(kind=real32) :: x
real(kind=real64) :: y
print *, minexponent(x), maxexponent(x)
print *, minexponent(y), maxexponent(y)
end program demo_minexponent
预期结果
-125 128
-1021 1024
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
precision#
名称#
precision(3) - [数值模型] 实数类型的十进制精度
概要#
result = precision(x)
integer function precision(x)
TYPE(kind=**),intent(in) :: x
特征#
x 应为实数或复数类型。它可以是标量或数组。
结果是默认的整数标量。
描述#
precision(3) 返回x类型的模型中的十进制精度。
选项#
- x
参数的类型和种类用于确定要查询哪个数字模型。参数的值未使用;它甚至可能未定义。
结果#
x的类型和种类的值的精度。
示例#
示例程序
program demo_precision
use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32
implicit none
real(kind=sp) :: x(2)
complex(kind=dp) :: y
print *, precision(x), range(x)
print *, precision(y), range(y)
end program demo_precision
结果
> 6 37
> 15 307
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
radix#
名称#
radix(3) - [数值模型] 数值模型的基数
概要#
result = radix(x)
integer function radix(x)
TYPE(kind=**),intent(in) :: x(..)
特征#
x 可以是任何实数或整数类型的标量或数组。
结果是默认的整数标量。
描述#
radix(3) 返回表示数值实体x的内部模型的基数。
在位置记数系统中,基数或底数是用于表示数字的唯一数字(包括数字零)的数量。
此函数有助于以通用方式表示内部计算模型,但对于所有常见平台上的所有数值类型,它都将为 2(表示二进制机器)。
选项#
- x
用于识别要查询的数字类型。
结果#
返回的值指示内部用于表示x表示的数值类型的基数。
示例#
示例程序
program demo_radix
implicit none
print *, "The radix for the default integer kind is", radix(0)
print *, "The radix for the default real kind is", radix(0.0)
print *, "The radix for the doubleprecision real kind is", radix(0.0d0)
end program demo_radix
结果
> The radix for the default integer kind is 2
> The radix for the default real kind is 2
> The radix for the doubleprecision real kind is 2
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
range#
名称#
range(3) - [数值模型] 数值类型的十进制指数范围
概要#
result = range(x)
integer function range (x)
TYPE(kind=KIND),intent(in) :: x
特征#
x 可以是整数、实数或复数类型。它可以是标量或数组。
KIND 是x类型支持的任何种类。
结果是默认的整数标量。
描述#
range(3) 返回x类型的模型中的十进制指数范围。
由于x仅用于确定正在查询的类型和种类,因此该值不需要被定义。
选项#
- x
用于查询的类型和种类对应的值
结果#
- 情况 (i)
对于整数参数,结果值为
int (log10 (huge(x)))
- 情况 (ii)
对于实数参数,结果值为
int(min (log10 (huge(x)), -log10(tiny(x) )))
- 情况 (iii)
对于复数参数,结果值为
range(real(x))
示例#
示例程序
program demo_range
use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32
implicit none
real(kind=sp) :: x(2)
complex(kind=dp) :: y
print *, precision(x), range(x)
print *, precision(y), range(y)
end program demo_range
结果
> 6 37
> 15 307
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),rrspacing(3),scale(3),set_exponent(3),spacing(3),tiny(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost
tiny#
名称#
tiny(3) - [数值模型] 实数类型的最小正数
概要#
result = tiny(x)
real(kind=KIND) function tiny(x)
real(kind=KIND) :: x
特征#
x 可以是任何实数标量或数组
结果与x具有相同的类型和种类
描述#
tiny(3) 返回x的类型和种类对应的最小正(非零)数。
对于实数x
result = 2.0**(minexponent(x)-1)
选项#
- x
用于确定要查询的模型类型的种类对应的值
结果#
指定种类的实数类型的最小正值。
示例#
示例程序
program demo_tiny
implicit none
print *, 'default real is from', tiny(0.0), 'to',huge(0.0)
print *, 'doubleprecision is from ', tiny(0.0d0), 'to',huge(0.0d0)
end program demo_tiny
结果
default real is from 1.17549435E-38 to 3.40282347E+38
doubleprecision is from 2.2250738585072014E-308 to
1.7976931348623157E+308
标准#
Fortran 95
另请参见#
digits(3),epsilon(3),exponent(3),fraction(3),huge(3),maxexponent(3),minexponent(3),nearest(3),precision(3),radix(3),range(3),rrspacing(3),scale(3),set_exponent(3),spacing(3)
fortran-lang 内在描述 (许可证:MIT) @urbanjost