Comment calculez-vous div et mod de nombres à virgule flottante?
En Perl, le %
opérateur semble supposer entiers. Par exemple:
sub foo {
my $n1 = shift;
my $n2 = shift;
print "perl's mod=" . $n1 % $n2, "\n";
my $res = $n1 / $n2;
my $t = int($res);
print "my div=$t", "\n";
$res = $res - $t;
$res = $res * $n2;
print "my mod=" . $res . "\n\n";
}
foo( 3044.952963, 7.1 );
foo( 3044.952963, -7.1 );
foo( -3044.952963, 7.1 );
foo( -3044.952963, -7.1 );
donne
perl's mod=6
my div=428
my mod=6.15296300000033
perl's mod=-1
my div=-428
my mod=6.15296300000033
perl's mod=1
my div=-428
my mod=-6.15296300000033
perl's mod=-6
my div=428
my mod=-6.15296300000033
Maintenant, comme vous pouvez le voir, j'ai trouvé une "solution" déjà pour le calcul de div
et mod
. Cependant, ce que je ne comprends pas, c'est l'effet que le signe de chaque argument doit avoir sur le résultat. Ne serait pas le div
toujours être positive, étant le nombre de fois n2
s'inscrit dans n1
? Comment est l'arithmétique censé fonctionner dans cette situation?
source d'informationauteur bugmagnet
Vous devez vous connecter pour publier un commentaire.
Donné
a = qd + r
il y a une ambiguïté lors du calcul de la solde pour les valeurs négatives ded
.E. g.:
L'expression
−42 ÷ −5
peut être exprimée soit en tant que:−42 = 9×(−5) + 3
ou−42 = 8×(−5) + (−2)
.De sorte que le reste est soit 3 ou -2.
Pour plus d'info: Wikipédia:Reste "l'Inégalité convaincu par le reste"
Également, la sortie dans le cas des nombres négatifs dans le mod /div est dépendant de l'implémentation dans les logiciels de langues. Voir Wikipédia: Modulo (regardez le tableau de droite)
Le titre pose une question, le corps de l'autre. Pour répondre à la question titre, tout comme en C, l'opérateur % est un entier modulo, mais il y a une routine de bibliothèque "fmod" c'est un flottant module.
donne