perl - resto - ¿Cómo se calcula div y mod de números de coma flotante?
division entera en c++ (2)
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 "fmod" que 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
En Perl, 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 pueden ver, ya se me ocurrió una "solución" para calcular div
y mod
. Sin embargo, lo que no entiendo es qué efecto debe tener el signo de cada argumento en el resultado. ¿No sería siempre positivo el div
, siendo la cantidad de veces que n2
encaja en n1
? ¿Cómo se supone que la aritmética funciona en esta situación?
Dado a = qd + r
, hay una ambigüedad al calcular el resto para los valores negativos de d
.
P.ej:
La expresión −42 ÷ −5
, se puede expresar como: −42 = 9×(−5) + 3
o −42 = 8×(−5) + (−2)
.
Entonces el resto es 3 o -2.
Para más información: Wikipedia: Resto "Desigualdad satisfecha por el resto"
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 del módulo (mira la tabla a la derecha)