Domanda

FORTRAN fornisce diverse funzioni per convertire un numero di precisione doppia in un valore integrale. Il metodo utilizzato per il troncamento / arrotondamento differisce. Sto convertendo complessi algoritmi scientifici che li usano.

Secondo la documentazione FORTRAN:
aint (x) restituisce il valore integrale tra x e 0, il più vicino x.
anint (x) restituisce il valore integrale più vicino a x, tranne che per i casi a metà          arrotondato al valore integrale più grande in grandezza.
nint (x) converte x in arrotondamenti in formato int al valore int più vicino, tranne          i casi a metà sono arrotondati al valore int maggiore in magnitudine.

Qualcuno ha un'implementazione di questi in C #? Potrebbe essere difficile farlo bene.

(int) x sembra corrispondere aint ()
Convert.ToInt32 (x) non corrisponde a nessuno dei precedenti.
Trunc (x) non corrisponde a nessuno dei precedenti.
Il giro (x) potrebbe corrispondere a un unendo o un altro

La differenza tra anint e nint sembra essere il tipo restituito, dove anint restituisce un valore di doppia precisione ma nint restituisce un numero intero. Entrambi sono usati (campione acutale):
DOPPIA PRECISIONE A, B, C, D, E, F, G
... valori impostati qui ...
F = ANINT (A-B) + ANINT (C-D) + ANINT (B + D-E)
G = NINT (F) + 1D0;
Forse un esperto FORTRAN potrebbe aiutare a chiarire il motivo per cui l'autore ha scelto di utilizzare entrambi (presumo fosse intenzionale).

È stato utile?

Soluzione

Dalle tue definizioni delle chiamate, nint e anint sono forniti da Math.Round utilizzando MidpointRounding.AwayFromZero .

Per aint , un cast esplicito da double a int otterrà quel risultato.

Altri suggerimenti

Da quello che posso vedere, aint () è solo Math.Floor () .

Per gli altri due, penso che tu abbia ragione nel dire che l'unica differenza è il tipo restituito: nint () restituisce un numero intero reale, mentre anint () restituisce un double (fortran: real) che sembra avere un valore integrale.

Ho un'implementazione della funzione anint, segui il codice:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top