Соответствие округления FORTRAN в C #

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 возвращает целое число. Используются оба (фактический образец):
DOUBLE PRECISION A, B, C, D, E, F, G
... значения, установленные здесь ...
F = ANINT (AB) + ANINT ( CD) + ANINT (B + DE)
G = NINT (F) + 1D0;
Возможно, эксперт по ФОРТРАНУ может помочь прояснить, почему автор решил использовать оба (я предполагаю, что это было намеренно).


person Mark T    schedule 29.10.2008    source источник


Ответы (3)


Исходя из ваших определений вызовов, nint и anint предоставляются Math.Round с использованием MidpointRounding.AwayFromZero.

Для aint явное приведение от double к int приведет к этому результату.

person Jeff Yates    schedule 29.10.2008
comment
документация здесь: msdn.microsoft.com/en-us/library /system.math.round.aspx Не существовало в ранних версиях C #. - person Mark T; 29.10.2008
comment
Спасибо, Марк. Я не знал о его отсутствии в более ранних изданиях. - person Jeff Yates; 29.10.2008

Насколько я могу судить, aint() просто Math.Floor().

Что касается двух других, я думаю, вы правы в том, что единственное различие заключается в типе возвращаемого значения: nint() возвращает фактическое целое число, а anint() возвращает значение типа double (fortran: real), которое имеет целочисленное значение.

person Joel Coehoorn    schedule 29.10.2008
comment
Floor () не ведет себя как aint () для отрицательных чисел. - person Mark T; 29.10.2008

У меня есть реализация функции 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;
}
person Leonardo Leano    schedule 02.07.2013