OVH Cloud OVH Cloud

INT curieux.

5 réponses
Avatar
Dominique
Bonjour,

Je suis sous Linux et j'utilise :
[normal@localhost perl]$ perl -v
This is perl, v5.8.3 built for i386-linux-thread-multi

Je trébuche sur de curieuses réponses de int :

#!/usr/bin/perl -w
$x=<STDIN>; #Plante avec $x=100.6565 ou 100.7575
print int($x*10000),"\n";

Pour les 2 valeurs proposées (100.6565 et 100.7575), les réponses sont
fausses ! Elles donnent 1006564 et 1007574. chomp n'y change rien.
J'ai voulu écrire un petit programme qui transforme des coordonnées ddd,mmss
en dd,dddd. En vérifiant mes résultats avec une calculatrice, j'ai constaté
cette erreur alors que je testais l'hypothèse un peu curieuse de
100°65'65". Avec n'importe quelle autre valeur de ddd, ça marche. Avec
100°, ça part en vrille.

Sur le site : http://postgis.refractions.net/CVS.txt,
je trouve :

2004-05-12 23:38 strk

* loader/shp2pgsql.c: DBFReadStringValue always used to workaround
shapelib bug with int values.

Y a-t-il un rapport avec mes interrogations ?, Si un bug a été décelé dans
int, comment faire pour le corriger ?

Merci et bon après-midi,
Dominique,
débutant en Perl et (grand) ancien en BASIC.

5 réponses

Avatar
Benoit Izac
Bonjour,

le 24/07/2004 à 17:28, Dominique a écrit
dans le message <cdtv6p$dbq$ :

Je trébuche sur de curieuses réponses de int :

#!/usr/bin/perl -w
$x=<STDIN>; #Plante avec $x0.6565 ou 100.7575
print int($x*10000),"n";

Pour les 2 valeurs proposées (100.6565 et 100.7575), les réponses sont
fausses ! Elles donnent 1006564 et 1007574. chomp n'y change rien.


pour une explication :
perldoc -f int
--
Benoit Izac

Avatar
Patrick Texier
Le Sat, 24 Jul 2004 17:28:25 +0200, Dominique a écrit :

Y a-t-il un rapport avec mes interrogations ?, Si un bug a été décelé dans
int, comment faire pour le corriger ?


Il faut utiliser les fonctions du module POSIX. C'est documenté.
--
Patrick Texier

Avatar
Dominique
Benoit Izac wrote:

pour une explication :
perldoc -f int


Bonjour,
Merci pour cette doc que je confesse avoir oublié de consulter.
printf et sprintf se contentent de formater un affichage sans changer la
valeur des variables. Je me trompe ? Si tel est le cas, ça ne répond pas à
ma question : extraire de façon sûre ddd, mm et ss de ma variable ddd,mmss.
Quelle solution pourriez-vous me suggérer ?
J'ai cherché vers :

#!/usr/bin/perl -w
print "Saisissez votre posiition en dd,mmss : ";$p=<STDIN>;
$h=int($p);
$m=(int(($p-$h)*100))/60;
$s=($p*10000-int($p*100)*100)/3600;
$pd=$h+$m+$s;
print "Position en dd,ddd : $pd,n";

Les réponses sont généralement bonnes mais la fiabilité n'est pas là à cause
de int.

Merci et bonne journée,
Dominique
PS : je suis débutant sous Perl et je n'en suis qu'à la page 57 de
"Introduction à Perl" de chez O'Reilly. Beaucoup de subtilités m'échappent
totalement. De plus, j'ai encore de gros restes du BASIC que j'ai très
longtemps utilisé. Ca fausse les repères avec Perl.

Avatar
Benoit Izac
Bonjour,

le 25/07/2004 à 07:32, Dominique a écrit
dans le message <cdvgm9$8v1$ :

pour une explication :
perldoc -f int


printf et sprintf se contentent de formater un affichage sans changer
la valeur des variables. Je me trompe ? Si tel est le cas, ça ne
répond pas à ma question : extraire de façon sûre ddd, mm et ss de ma
variable ddd,mmss. Quelle solution pourriez-vous me suggérer ?


#!/usr/bin/perl -w
use strict;

my $reponse;
my ($h, $m, $s) = (0, 0, 0);

while (1) {
print "Saisissez votre posiition en dd.mmss : ";
chomp ($reponse = <STDIN>);
# verification que le format est correct
unless ($reponse =~ /^(d*).?(d{0,2})(d{0,2})$/) {
print "Vous n'avez pas entré un nombre correctn";
next;
}
if ($2 && $3 && ($2 >= 60 || $3 >`)) {
print "les minutes et les secondes doivent être entre 0 et 59n";
next;
}

$h = $1 if ($1 > 0);
$m = $2 if ($2 > 0);
$s = $3 if ($3 > 0);

print "heure = $hnminute = $mnseconde = $sn";
last;
}

# reste du traitement

__END__

--
Benoit Izac


Avatar
Dominique
Benoit Izac wrote:

Bonjour,

#!/usr/bin/perl -w
use strict;

my $reponse; etc...


Bonjour,
J'ai voulu faire un copier-coller de ta proposition (où je suis obligé de
confesser que tout ne m'est pas très compréhensible...) mais, visiblement,
le passage par internet a dû modifier quelque chose : je trébuche sur des
caractères (lesquels ???) non reconnus par Perl et Xemacs sur toutes les
lignes.
Pourrais-tu repasser ton script sur le forum en pièce jointe ou me
l'adresser sur ma BAL : le-voileux hébergé par ouanadou en France.
Merci et bonne journée,
Dominique