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

044.rounding_取整函数

取整函数有多个,int向零截断;nintanint选择最近整数值,恰好等距时取绝对值较大的整数;floor取不大于参数的最大整数,ceiling取不小于参数的最小整数。其中anint返回实数,其余函数在本文用法中返回整数。fortran取整函数不仅返回值不同,取整方向和结果类型也不同。

适用场景

  • 把测量值或计算结果归到最近的整数刻度时使用nint;后续仍需保持实数运算时可使用anint
  • 根据坐标确定其所在网格区间时常使用floor,它对负坐标仍沿负无穷方向取整。
  • 计算至少需要多少个容器、计算节点或固定长度时间段时使用ceiling,确保容量能够覆盖总需求。
  • int适合明确需要趋零截断或进行类型转换的情况,不应把它当作通用四舍五入函数。

语法结构

integerResult = int(realValue [, kind])
integerResult = nint(realValue [, kind])
realResult = anint(realValue [, kind])
integerResult = floor(realValue [, kind])
integerResult = ceiling(realValue [, kind])

可选的kind指定结果种类:对intnintfloorceiling而言是整数种类;对anint而言是实数种类。转换结果必须能由所选整数种类表示,否则结果不可靠。

本文代码

! 用正数、负数和半整数比较不同取整规则。
program roundingDemo
  implicit none

  real, parameter :: values(*) = [3.6, -3.6, 2.5, -2.5]
  integer :: i

  print "(A)", " value   int  nint  floor  ceiling  anint"
  do i = 1, size(values)
    print "(F6.1,4(2X,I5),2X,F7.1)", values(i), int(values(i)), &
      nint(values(i)), floor(values(i)), ceiling(values(i)), anint(values(i))
  end do
end program roundingDemo

编译运行

(base) hong@hongdeMacBook-Pro 044.rounding % gfortran -Wall -Wextra -std=f2018 exampleRounding.f90
(base) hong@hongdeMacBook-Pro 044.rounding % ./a.out
 value   int  nint  floor  ceiling  anint
   3.6      3      4      3      4      4.0
  -3.6     -3     -4     -4     -3     -4.0
   2.5      2      3      2      3      3.0
  -2.5     -2     -3     -3     -2     -3.0

现象分析

对3.6,趋零与向下都得到3,最近整数与向上都得到4;仅看正数无法分辨这些规则。换成-3.6后差异出现:int趋近零得到-3,floor沿负无穷方向得到-4,ceiling沿正无穷方向得到-3,而最近整数是-4。

2.5与整数2、3距离相同,nintanint选择远离零的3;-2.5位于-2与-3中间,因此选择-3。这不是“总向上”或“总向下”,而是最近整数规则在等距情况下的规定。

nintanint的数值选择相同,但表中前者显示为3和-3,后者显示为3.0和-3.0,因为前者返回整数,后者返回实数。输出格式只用于展示这种类型差异,不影响取整结果。

核心知识点

  • int趋向零,floor趋向负无穷,ceiling趋向正无穷。
  • nintanint取最近整数值;半整数等距时远离零。
  • nint返回整数,anint返回实数,选择函数时必须同时考虑规则和结果类型。
  • 负数最能暴露趋零、向下和向上的区别,验证取整逻辑时不应只测试正数。

发表回复

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