Pregunta

En Perl, el % El operador parece asumir números enteros.Por ejemplo:

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 );

da

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

Ahora, como puedes ver, ya se me ocurrió una "solución" para calcular div y mod.Sin embargo, lo que no entiendo es qué efecto debería tener el signo de cada argumento en el resultado.¿No sería el div ser siempre positivo, siendo el número de veces n2 encaja en n1?¿Cómo se supone que funciona la aritmética en esta situación?

¿Fue útil?

Solución

Dado a = qd + r, existe una ambigüedad al calcular el resto para valores negativos de d.

Por ejemplo:

La expresión −42 ÷ −5, se puede expresar como: −42 = 9×(−5) + 3 o −42 = 8×(−5) + (−2).

Entonces, el resto es 3 o & # 8722; 2.

Para obtener más información: Wikipedia: Restante " ¡Desigualdad satisfecha por el resto quot;

Además, la salida en caso de números negativos en mod / div depende de la implementación en los lenguajes de software. Ver Wikipedia: Operación de módulo (mira la tabla a la derecha)

Otros consejos

El título hace una pregunta, el cuerpo otra. Para responder la pregunta del título, al igual que en C, el operador% es un módulo entero, pero hay una rutina de biblioteca & Quot; fmod & Quot; ese es un módulo de coma flotante.

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 );

da

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top