Article View: pl.comp.lang.python
Article #452Re: Bledne zaokraglanie ulamkow
From: Marcin 'Qrczak' Kowalczyk
Date: Sun, 29 Dec 2002 10:43
Date: Sun, 29 Dec 2002 10:43
64 lines
3477 bytes
3477 bytes
Sat, 28 Dec 2002 03:43:52 +0100, Marcin Wojtczuk <fastviper@telkab.pl> pisze:
>> Bo 31.97 nie jest reprezentowalne w typie double w C,
>
> Bzdura:
> Po pierwsze:
> 31,97 = $1F.61 = $1.F61 * 16.
Nieprawda. $1F.61 = 31.37890625, a nie 31.97. 97/100 nie jest
reprezentowalne ułamkiem z mianownikiem będącym potęgą dwójki,
więc nie jest reprezentowalne w dwójkowym zmiennopozycyjnym typie
o żadnej dokładności. Tak jak 1/3 nie jest reprezentowalne w systemie
dziesiętnym w żadnej skończonej liczbie cyfr.
> /* Number of decimal digits of precision in a double */
> #define DBL_DIG 15
> #v-
> (cytat z float.h). Czyli każda liczba o mniej niż 15 cyfrach po przecinku
> jest w double reprezentowana DOKŁADNIE.
Bzdura. Znaczy to tylko tyle, że dla każdej takiej liczby istnieje
taka wartość typu double, która zaokrąglona do 15 cyfr dziesiętnych
da tę liczbę z powrotem.
> Python ma jakieś niejasne zasady precyzji artmetyki. Ktoś wie jakie ?
Takie jak C.
>> Po przetłumaczeniu na ułamek dziesiętny widać, że to ciut mniej
>> niż 31.97; następna reprezentowalna wartość jest ciut większa niż
>> 31.97. Więc co chcesz uzyskać? Dokładna liczba 31.97 w typie float
>> nie istnieje.
>
> Taak ?
> #v+
> /* Number of decimal digits of precision in a float */
> #define FLT_DIG 6
Mam na myśli float Pythona, czyli double C, ale sytuacja jest
analogiczna.
>> str pokazuje o jedną mniej cyfr niż repr, więc str od Twojej liczby
>> da '31.97'. Więc nie przejmuj się, że jak się ją wpisze w prompcie,
>> to widać więcej cyfr (to jest wyświetlane przez repr).
>
> Fajnie by było wiedzieć jaką logiką kieruje się tutaj python.
str: żeby liczba o małej liczbie dziesiętnych cyfr po przecinku była
pokazana właśnie w taki sposób - bo najprawdopodobniej taka liczba
powstała przez zaokrąglenie odpowiedniej liczby dziesiętnej.
repr: żeby można było dokładnie odtworzyć liczbę z jej tekstowej
reprezentacji.
Można było zrobić lepiej, tak jak to robi np. Glasgow Haskell Compiler,
co jest trudniejsze w realizacji. Mianowicie pokazywać zawsze liczbę
w 15 cyfrach dziesiętnych, o ile konwersja takiej reprezentacji
z powrotem na double dałaby ten sam wynik, i w 16, jeśli nie. Daje
to obie zalety równocześnie.
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID:
<slrnb0tkec.a1h.qrczak@qrnik.zagroda>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!newsfeed01.sul.t-online.de!t-online.de!newsfeed.tpinternet.pl!news.tpi.pl!nnrpdReferences:
<3e09e4d7.2127062@news.icpnet.pl> <slrnb0jrgs.u54.qrczak@qrnik.zagroda> <853jua-58g.ln@fastviper.viper.lan>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!newsfeed01.sul.t-online.de!t-online.de!newsfeed.tpinternet.pl!news.tpi.pl!nnrpd From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl> Newsgroups: pl.comp.lang.python Subject: Re: Bledne zaokraglanie ulamkow Date: Sun, 29 Dec 2002 10:43:24 +0000 (UTC) Organization: Klub Nieszkodliwych Manjaków Lines: 64 Message-ID: <slrnb0tkec.a1h.qrczak@qrnik.zagroda> References: <3e09e4d7.2127062@news.icpnet.pl> <slrnb0jrgs.u54.qrczak@qrnik.zagroda> <853jua-58g.ln@fastviper.viper.lan> NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl Mime-Version: 1.0 X-Trace: news.tpi.pl 1041158690 9408 217.96.225.87 (29 Dec 2002 10:44:50 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Sun, 29 Dec 2002 10:44:50 +0000 (UTC) X-Path-Notice: Path line has been filtered X-Original-Path: localhost!not-for-mail User-Agent: slrn/0.9.7.4 (Linux) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit