在C#中匹配FORTRAN舍入
-
05-07-2019 - |
题
FORTRAN提供了几个函数来将双精度数转换为整数值。用于截断/舍入的方法不同。我正在转换使用这些算法的复杂科学算法。
根据FORTRAN文件:
aint(x)返回x和0之间的整数值,最接近x。
anint(x)返回最接近x的整数值,除了中途情况
舍入到幅度更大的积分值。
nint(x)将x转换为int格式舍入到最接近的int值,除外
中途案例四舍五入到较大的int值。
有人在C#中实现了这些吗? 正确的做法可能很棘手。
(int)x似乎与aint()匹配 Convert.ToInt32(x)与上述任何一个都不匹配 Trunc(x)与上述任何一个都不匹配 Round(x)可能与anint或nint匹配。结果
anint和nint之间的区别似乎是返回类型,其中anint返回双精度值,但nint返回一个整数。两者都使用(实际样本):
双精度A,B,C,D,E,F,G
...这里设置的值...
F = ANINT(A-B)+ ANINT(C-D)+ ANINT(B + D-E)
G = NINT(F)+ 1D0;
也许FORTRAN专家可以帮助澄清作者选择使用两者的原因(我假设它是有意的)。
解决方案
根据您对调用的定义, nint
和 anint
由 Math.Round提供
使用 MidpointRounding.AwayFromZero
。
对于 aint
,从 double
到 int
的显式转换将实现该结果。
其他提示
从我所看到的, aint()
只是 Math.Floor()
。
对于另外两个,我认为你是对的,唯一的区别是返回类型: nint()
返回一个实际的整数,而 anint()
返回一个double(fortran:real)碰巧有一个整数值。
我有一个函数anint的实现,请遵循以下代码:
double anint(double x)
{
int a;
double y;
a = (int)x; //a=9
if (10 * x - 10 * (double)a >= 5)
{
a = a + 1;
}
y = (double)a;
return y;
}