Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problèmes avec Math::Trig

6 views
Skip to first unread message

Alain BarBason

unread,
Jan 7, 2012, 10:48:32 AM1/7/12
to
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

Paul Gaborit

unread,
Jan 7, 2012, 7:06:14 PM1/7/12
to

À (at) Sat, 07 Jan 2012 16:48:32 +0100,
Alain BarBason <al...@barbason.be> écrivait (wrote):

> 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.

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.

> Et pourquoi dois je expliciter Math::Trig::deg2deg et pas rad2deg,
> sachant que
>
> use Math::Trig qw(deg2deg);
>
> génère une erreur.

Parce que Math::Trig n'exporte pas du tout la fonction deg2deg (ni
aucune fonction xxx2xxx).

Deux bugs de Math::Trig...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>

Jean-Louis Morel

unread,
Jan 7, 2012, 8:49:21 PM1/7/12
to
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

Alain BarBason

unread,
Jan 8, 2012, 4:26:17 AM1/8/12
to
bonjour,

> La fonction _remt est fautive comme l'a dit Paul Gaborit.

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"

> 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.

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

Paul Gaborit

unread,
Jan 8, 2012, 7:01:21 AM1/8/12
to

À (at) Sun, 08 Jan 2012 10:26:17 +0100,
Alain BarBason <al...@barbason.be> écrivait (wrote):

> bonjour,
>
>> La fonction _remt est fautive comme l'a dit Paul Gaborit.
>
> 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"

C'est bien un bug et je l'ai signalé sur rt.cpan.org :
<https://rt.cpan.org/Public/Bug/Display.html?id=73817>

>> 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.
>
> 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.

À mon avis ces fonctions devraient être exportables. Ou alors, au
minimum, leur non-exportation devrait être indiquée dans la
documentation.
0 new messages