Le 07/01/2012 16:48, Alain BarBason a écrit :
> J'utilise le module Math::Trig et j'ai deux problèmes.
> voici le code (j'ai simplifié :-)
>
> #!/usr/bin/perl
> use Math::Trig;
> print rad2deg(atan2(-1,1));
> print Math::Trig::deg2deg(-45);
>
> Pourquoi ai-je une valeur négative comme réponse, alors que dans
> perldoc Math::Trig j'ai :
>
> The full circle is 2 pi radians or 360 degrees or 400 gradians. The
> result is by default wrapped to be inside the [0, {2pi,360,400}[ circle.
>
> Et pourquoi dois je expliciter Math::Trig::deg2deg et pas rad2deg,
> sachant que
>
La fonction _remt est fautive comme l'a dit Paul Gaborit.
sub _remt ($$) {
# Oh yes, POSIX::fmod() would be faster. Possibly. If it is available.
$_[0] - $_[1] * int($_[0] / $_[1]);
}
Elle utilise la partie entière int au lieu de floor.
int(x) est la partie entière de x
floor(x) est le plus grand entier relatif inférieur ou égal à x.
Les deux fonctions coïncident pour x positif :
int(3.6)=3 et floor(3.6)=3
mais pour les nombres négatifs les résultats sont différents :
int(-3.6)=-3 et floor(-3.6)=-4
L'utilisation de POSIX::fmod ne change rien sur ce point.
Une solution est de redéfinir _remt dans votre script :
#!/usr/bin/perl
use strict;
use warnings;
use Math::Trig;
package Math::Trig; # on rentre dans le package Math::Trig
use POSIX; # nécessaire pour fonction floor
no warnings; # évite "Subroutine _remt redefined at..."
sub _remt ($$) { # redéfinition de la fonction fautive
$_[0] - $_[1] * floor($_[0] / $_[1]);
}
package main; # on retourne à notre programme
print rad2deg(atan2(-1,1)), "\n";
print Math::Trig::deg2deg(-45);
__END__
Le module exporte uniquement les fonctions rad2deg, rad2grad, deg2rad,
deg2grad, grad2rad et grad2deg.
Les fonctions rad2rad, deg2deg et grad2grad ne sont pas exportées; elles
sont appelées par les 6 fonctions précédentes par défaut. On n'a pas
normalement à les utiliser directement.
HTH
--
J-L
http://www.bribes.org/perl