Article View: pl.comp.lang.perl
Article #416Re: int ???
From: Piotr Auksztulewicz
Date: Tue, 01 Jul 1997 14:58
Date: Tue, 01 Jul 1997 14:58
78 lines
2492 bytes
2492 bytes
Bartlomiej Czardybon (czar@david.silesia.pik-net.pl) wrote:
: Czesc
:
: Jak ktos zgadnie co ten kod wypisze to stawiam piwo, jak mi powie
: dlaczego to wypisuje to stawiam piec piw :-))
: sub konwertuj {
: $ile=$_[0];
To jest blad. Powinno byc:
my $ile = $_[0];
Ale w tym przypadku to akurat nie ma znaczenia.
: return int($ile*100);
: }
: $ile="19.40";
: print $ile*100,"\n";
: print konwertuj($ile)."\n";
Sprawdzilem, co wypisuje:
1940
1939
Zrobilem to prosciej, zeby sie upewnic, ze nie jest cos nakombinowane
z ta procedura:
perl -e 'print 19.40*100, "\t", int(19.40*100), "\n"'
Efekt ten sam. Powod: obliczenia zmiennoprzecinkowe. Bynajmniej nie jest
to bug w PA-RISCu (zakladam, ze puszczales to na zeusie).
Generalnie takie cos:
(x*y)/y == x
(i wiele podobnych) nie zawsze jest prawdziwe dla obliczen
zmiennoprzecinkowych! Akurat miales pecha z tym 19.40. Zrobilem to w C:
#include <stdio.h>
#include <math.h>
main()
{
double ile = 19.40;
printf("%f\t%f\n", ile*100.0, floor(ile*100.0));
}
Efekt: 1940.000000 1939.000000
Zrobilem to samo na liczbach o mniejszej precyzji (float) i dostalem:
1939.999962 1939.000000
Wszystko jasne? (piwo tez?)
(Wniosek dodatkowy: perl uzywa podwojnej precyzji...)
PS. Pentium liczy tak samo (puscilem to na Linuxie).
# cat /proc/cpuinfo
processor : 0
cpu : 586
model : Pentium 75+
vendor_id : GenuineIntel
stepping : 5
fdiv_bug : no <--- nie ma buga w procesorze!
hlt_bug : no
fpu : yes
fpu_exception : yes
cpuid : yes
wp : yes
flags : fpu vme de pse tsc msr mce cx8
bogomips : 39.83
--
Piotr Auksztulewicz piotras@zeus.polsl.gliwice.pl
Centrum Komputerowe Politechniki Slaskiej, Gliwice, Akademicka 16
Technical Details
Message-ID:
<5pb5us$ccu@zeus.polsl.gliwice.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!ict.pwr.wroc.pl!polsl.gliwice.pl!polsl.gliwice.pl!not-for-mailReferences:
<5patf0$d5d@zeus.polsl.gliwice.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!ict.pwr.wroc.pl!polsl.gliwice.pl!polsl.gliwice.pl!not-for-mail From: piotras@polsl.gliwice.pl (Piotr Auksztulewicz) Newsgroups: pl.comp.lang.perl Subject: Re: int ??? Date: 1 Jul 1997 16:58:36 +0200 Organization: Politechnika Slaska, Gliwice Lines: 78 Message-ID: <5pb5us$ccu@zeus.polsl.gliwice.pl> References: <5patf0$d5d@zeus.polsl.gliwice.pl> NNTP-Posting-Host: zeus.polsl.gliwice.pl X-Newsreader: TIN [version 1.2 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit