1

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(AB) + ANINT(CD) + ANINT(B+DE)
G = NINT(F) + 1D0;
也许 FORTRAN 专家可以帮助澄清为什么作者选择使用两者(我假设这是故意的)。

4

3 回答 3

3

根据您对调用的定义,nintanint使用.Math.RoundMidpointRounding.AwayFromZero

对于,从toaint的显式转换将实现该结果。doubleint

于 2008-10-29T15:08:59.973 回答
1

从我所见,aint()只是Math.Floor()

对于另外两个,我认为你是对的,唯一的区别是返回类型:nint()返回一个实际的整数,而anint()返回一个恰好具有整数值的 double (fortran: real)。

于 2008-10-29T15:12:12.370 回答
0

我有一个函数 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;
}
于 2013-07-02T13:26:15.420 回答