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).

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top