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;
Возможно, эксперт по ФОРТРАНУ сможет прояснить, почему автор решил использовать оба (я предполагаю, что это было намеренно).





Из ваших определений вызовов, nint и anint предоставляются Math.Round с использованием MidpointRounding.AwayFromZero.
Для aint явное приведение из double в int приведет к этому результату.
Спасибо, Марк. Я не знал о его отсутствии в более ранних изданиях.
Насколько я могу судить, aint() - это просто Math.Floor().
Что касается двух других, я думаю, вы правы в том, что единственная разница заключается в типе возвращаемого значения: nint() возвращает фактическое целое число, а anint() возвращает двойное число (fortran: real), которое имеет целочисленное значение.
Floor () не ведет себя как aint () для отрицательных чисел.
У меня есть реализация функции 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;
}
документация здесь: msdn.microsoft.com/en-us/library/system.math.round.aspx Не существовало в ранних версиях C#.