Problèmes avec Math::Trig
Le
Alain BarBason

Bonjour,
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
use Math::Trig qw(deg2deg);
génère une erreur.
Bien le merci.
AlainBB
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
use Math::Trig qw(deg2deg);
génère une erreur.
Bien le merci.
AlainBB
Alain BarBason
Parce que la fonction suivante (extraite de Math::Trig) :
# Truncating remainder.
sub _remt ($$) {
# Oh yes, POSIX::fmod() would be faster. Possibly. If it is available.
$_[0] - $_[1] * int($_[0] / $_[1]);
}
n'arrondit pas dans le bon sens lorsque le premier argument est négatif.
Parce que Math::Trig n'exporte pas du tout la fonction deg2deg (ni
aucune fonction xxx2xxx).
Deux bugs de Math::Trig...
--
Paul Gaborit - Perl en français -
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
Bien le merci pour ces réponses;
Je reste étonné de trouvé une erreur de ce type dans un module déjà
ancien. Est-ce un bug à signaler sur
http://search.cpan.org/~zefram/Math-Complex-1.58/lib/Math/Trig.pm ou
est-ce considéré comme un "fonctionnalité non documentée"
Je comprends bien l'aspect technique, mais je trouve que ce n'est pas
explicite dans la documentation. Moins gênant que le bug précédent
évidemment.
Bien le merci.
AlainBB
Alain BarBason
C'est bien un bug et je l'ai signalé sur rt.cpan.org :
À mon avis ces fonctions devraient être exportables. Ou alors, au
minimum, leur non-exportation devrait être indiquée dans la
documentation.
--
Paul Gaborit - Perl en français -