🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #224

Re: perl - banalny problem?

#224
From: Miroslaw Kwasniak
Date: Thu, 09 Sep 1999 09:44
60 lines
3031 bytes
Piotr Woszczynski <woszcz@icso.com.pl> wrote:
PW>Hej!

PW>Ostatnimi czasy natchnelo mnie do nauki perla (tak na poczatek). Jezyk
PW>wydaje mi sie w miare prosty i przejrzysty, z olbrzymimi mozliwosciami,
PW>ale... No wlasnie.
PW>Napisalem cos takiego:

PW>#! /usr/bin/perl 

PW>$dx=0.01;
PW>$nx=950;

PW>while ($nx < 1000){
PW>  $nx += $dx;
PW>  print "nowe nx=$nx\n";
PW>}

PW>Prawda ze banal?
PW>Uruchomilem... i zbaranialem. Otoz w pewnym momencie programik zaczal
PW>wypluwac wyniki typu (tak troche z pamieci bo pisze ten post z windy):
PW>nowe nx=960.0599998898
PW>nowe nx=960.0699998898
PW>itd.
PW>Zaznaczam ze dla wartosci $dx calkowitych ta przypadlosc nie zachodzi,
PW>dla mniejszej liczby iteracji tez nie.
PW>Domyslam sie ze pewnie na wysokosci 1E-7 (powiedzmy) "zamiata" jakies
PW>smieci z pamieci, co powoduje przy odpowiedniej liczbie iteracji
PW>propagacje bledu i wyniki sa takie jakie sa. W jaki sposob mozna to
PW>obejsc (czy w ogole jest na to jakis sposob)? Zaczalem podejrzewac ze
PW>moze procek jest nieco padniety i wprowadza przeklamania, ale tez nie,
PW>sprawdzalem na 2 roznych kompach i wyniki mniej wiecej te same. Z reszta
PW>parokrotnie na obu kompach przekompilowywalem jadro linuxa i calos jakos
PW>chodzi...
PW>Probowalem byc takze "chytry" w ten sposob ze podawalem (nieco na
PW>lopatologicznie) 
PW>$dx=0.0100000000000000000000000000000000000000000000000
PW>i ten sam wynik. Pewnie ze mozna uznac ze jest to przyblizenie, ale tak
PW>wygenerowane liczby maja mi sluzyc do porownywania z wartosciami
PW>wprowadzonymi, a w tym przypadku perl staje sie bardzo konsekwentny i
PW>wcale nie uwaza ze (w zasadzie slusznie) ze wartosc np. 960.06 =
PW>960.0599998898 
PW>Any idea?

Wszystko w porządku (polecam dowolną literaturę na temat obliczeń
zmienno-przecinkowych). Tak zachowuje się nie tylko perl, ale i każdy inny
(normalny) język programowania operujący na typach zmiennoprzecinkowych.
W twoim przypadku jako krytermium porównania należy przyjąć warunek
(zapisany w języku abstrakcyjnym, gdyż nie znam perla):

    abs( x1 - x2 ) <= eps

albo lepiej (ogólniej)

    abs( x1 - x2 ) <= eps * max( abs(x1), abs(x2) )

gdzie eps zależy od gwarantowanej dokładności reprezentacji
zmiennoprzecinkowej.

Mirek
Technical Details
Message-ID: <7r7viq$pjv$1@sun1000.pwr.wroc.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.icm.edu.pl!news.man.poznan.pl!news.man.lodz.pl!pwr.wroc.pl!not-for-mail
References: <37D7467F.4FFB7171@icso.com.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.icm.edu.pl!news.man.poznan.pl!news.man.lodz.pl!pwr.wroc.pl!not-for-mail
From: Miroslaw Kwasniak <pisz_do_mnie_na/mirek.kwasniak@zind.ikem.pwr.wroc.pl>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: perl - banalny problem?
Date: 9 Sep 1999 09:44:57 GMT
Organization: Wroclaw University of Technology
Lines: 61
Message-ID: <7r7viq$pjv$1@sun1000.pwr.wroc.pl>
References: <37D7467F.4FFB7171@icso.com.pl>
NNTP-Posting-Host: sun1000.pwr.wroc.pl
Mime-Version: 1.0
User-Agent: tin/pre-1.4-19990805 ("Preacher Man") (UNIX) (Linux/2.2.12 (i486))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit