Matching FORTRAN Rundung in C#
-
05-07-2019 - |
Frage
FORTRAN bietet mehrere Funktionen zum konvertieren von einem double-precision-Nummer zu einem ganzzahligen Wert.Die Methode, die für die Trunkierung/Rundung unterscheidet.Ich bin Umwandlung von komplexen wissenschaftlichen algorithmen, die diese verwenden.
Nach FORTRAN-Dokumentation:
aint(x) gibt den ganzzahligen Wert zwischen x und 0, nächste x.
anint(x) liefert den nächsten ganzzahligen Wert x, außer auf halbem Weg Fälle
gerundet auf den ganzzahligen Wert größer in der Größe.
nint(x) konvertiert x in den int-format Rundung auf den nächsten int-Wert, außer
auf halbem Weg Fälle sind abgerundet, um den int-Wert größer in der Größe.
Hat jemand eine Umsetzung dieser in C#? Es könnte schwierig sein, es richtig zu machen.
(int)x erscheint match aint()
Konvertieren.ToInt32(x) nicht mit einer der oben genannten.
Trunc(x) nicht mit einer der oben genannten.
Round(x) entsprechen könnten anint oder Nintendo.
Der Unterschied zwischen anint und Nintendo scheint die zurück-Typ, wo anint gibt eine double-precision-Wert, aber Nintendo gibt eine Ganzzahl zurück.Beide genutzt aktuellen Beispiel):
DOUBLE PRECISION A, B, C, D, E, F, G
...Werte hier einstellen ...
F = ANINT(A-B) + ANINT(C-D) + ANINT(B+D-E)
G = NINT(F) + 1D0;
Vielleicht ein FORTRAN-Experte, könnte helfen, zu klären, warum der Autor entschied sich, beide zu verwenden (ich gehe davon aus, dass es Absicht war).
Lösung
Aus den Definitionen der Anrufe, nint
und anint
werden zur Verfügung gestellt von Math.Round
Verwendung MidpointRounding.AwayFromZero
.
Für aint
, eine explizite Typumwandlung aus double
zu int
erreichen, das Ergebnis.
Andere Tipps
Von dem, was ich sehen kann, aint()
nur Math.Floor()
.
Für die beiden anderen, ich glaube, Sie haben Recht, dass der einzige Unterschied ist der return-Typ: nint()
gibt eine tatsächliche Ganzzahl, während anint()
gibt ein double zurück (fortran:real) ist, die zufällig ein fester Wert.
Ich habe eine Implementierung der Funktion anint, Folgen Sie den code:
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;
}