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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top