Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problèmes avec Math::Trig

4 réponses
Avatar
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

4 réponses

Avatar
Paul Gaborit
À (at) Sat, 07 Jan 2012 16:48:32 +0100,
Alain BarBason é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/>
Avatar
Jean-Louis Morel
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
Avatar
Alain BarBason
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
Avatar
Paul Gaborit
À (at) Sun, 08 Jan 2012 10:26:17 +0100,
Alain BarBason é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?ids817>

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.

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