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