Arrotondamento FORTRAN corrispondente in C #
-
05-07-2019 - |
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).
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;
}