Question

FORTRAN fournit plusieurs fonctions pour convertir un nombre double précision en une valeur intégrale. La méthode utilisée pour la troncature / l'arrondi diffère. Je convertis des algorithmes scientifiques complexes qui les utilisent.

Selon la documentation FORTRAN:
aint (x) renvoie la valeur de l'intégrale entre x et 0, le plus proche de x.
anint (x) renvoie la valeur intégrale la plus proche de x, sauf que la moitié des cas sont          arrondi à la valeur intégrale de magnitude supérieure.
nint (x) convertit x au format int en arrondissant à la valeur int la plus proche, sauf          les cas intermédiaires sont arrondis à la valeur int de magnitude supérieure.

Quelqu'un a-t-il une implémentation de ceux-ci en C #? Il peut être difficile de bien faire les choses.

(int) x semble correspondre à aint ()
Convert.ToInt32 (x) ne correspond à aucune de ces réponses.
Trunc (x) ne correspond à aucune de ces réponses.
Round (x) peut correspondre à anint ou nint.

La différence entre anint et nint semble être le type de retour, où anint renvoie une valeur double précision mais nint renvoie un entier. Les deux sont utilisés (échantillon exact):
DOUBLE PRÉCISION A, B, C, D, E, F, G
... les valeurs définies ici ...
F = ANINT (AB) + ANINT (C-D) + ANINT (B + D-E)
G = NINT (F) + 1D0;
Peut-être un expert de FORTRAN pourrait-il nous aider à préciser pourquoi l'auteur a choisi d'utiliser les deux (je suppose que c'était intentionnel).

Était-ce utile?

La solution

Parmi vos définitions des appels, nint et et sont fournis par Math.Round. à l'aide de MidpointRounding.AwayFromZero .

Pour inint , une conversion explicite de double en int permet d'obtenir ce résultat.

Autres conseils

D'après ce que je peux voir, aint () est simplement Math.Floor () .

Pour les deux autres, je pense que vous avez raison de dire que la seule différence est le type de retour: nint () renvoie un entier, alors que anint () renvoie un double (fortran: real) qui a une valeur intégrale.

J'ai une implémentation de la fonction anint, suivez le 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top