Question

En Perl, l'opérateur % semble assumer des 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

Comme vous pouvez le constater, j'ai mis au point une & "solution &"; déjà pour calculer div et mod. Cependant, ce que je ne comprends pas, c’est l’effet que le signe de chaque argument devrait avoir sur le résultat. Le n2 ne serait-il pas toujours positif, étant le nombre de fois que n1 correspond à <=>? Comment l'arithmétique est-elle censée fonctionner dans cette situation?

Était-ce utile?

La solution

Étant donné a = qd + r, le calcul du reste pour les valeurs négatives de d est ambigu.

Exemple:

L'expression −42 ÷ −5 peut être exprimée sous la forme suivante: −42 = 9×(−5) + 3 ou −42 = 8×(−5) + (−2).

Le reste est alors soit 3, soit & # 8722; 2.

Pour plus d'informations: Wikipedia: Reste " Inégalité satisfaite par le reste quot;

De plus, la sortie en cas de nombres négatifs dans mod / div dépend de la mise en œuvre dans les langages logiciels. Voir Wikipedia: opération Modulo (consultez le tableau à droite)

.

Autres conseils

Le titre pose une question, le corps une autre. Pour répondre à la question du titre, comme en C, l'opérateur% est un module entier, mais il existe une routine de bibliothèque & "; Fmod &"; c'est un module en virgule flottante.

use POSIX "fmod";

sub foo {
    my $n1 = shift;
    my $n2 = shift;
    print "perl's fmod=" . fmod($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 fmod=6.15296300000033
my div=428
my mod=6.15296300000033

perl's fmod=6.15296300000033
my div=-428
my mod=6.15296300000033

perl's fmod=-6.15296300000033
my div=-428
my mod=-6.15296300000033

perl's fmod=-6.15296300000033
my div=428
my mod=-6.15296300000033
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top