sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #09307
bc(1) med _mange_ decimaler [was: Re: Irriterende!!!]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Morten Olsen <pbk1105@xxxxxxxxxxxxxx> writes:
> Christian Hansen wrote:
> >
> > u har jeg lige opdaget en meget irriterende fejl i Mange af de
> > lommeregnere, der kommer med de forskellige windowmanagere.
> >
> > Prøv at kvadrer tallet 1,0000001 27 gange. Resultatet skulle helst gi
> > 674530,4707 med 10 betydende cifre.
Ja, forudsat mellemregningerne er tilstrækkeligt præcise. Det ser vi om lidt.
> > KDE og GNOME's lommeregner melder ud med 674530,4755
Det er da et fint resultat, med hele 8 korrekte cifre.
> > Min Casio lommeregner får det til 674529,1097
>
> Ja, og min HP48G får 674514,86877.
>
> Matlab (under HP/UX på en HPPA RISC processor) giver:
>
> x =
>
> 6.745304755217875e+05 (=674530,4755)
>
> Hvilket faktisk er _præcist_ hvad med hvad KDE & GNOME lommeregnerne
> giver
>
> Følgende "bc" program:
>
> t=0;
> x=1.0000001
> while (t<27) {
> x = x * x;
> t++;
> }
> print x;
>
> giver 671189.6536185
Ja, med default-præcisionen. Det resultat får man meget nemmere således:
$ bc
bc 1.05
Copyright 1991, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1.0000001^(2^27)
671189.6536185
Men default-præcisionen er alt for lille til dette problem. Vi fortsætter:
scale=20
1.0000001^(2^27)
674530.47074084266695329142
Det var bedre. Med 20 cifre i mellemregningerne får vi Christians resultat i
de 10 mest betydende cifre.
> Det er "bc" programmet der er korrekt (burde ihvertfald være, det er jo
> svært at regne efter!)
Man kan checke resultatet ved at se hvordan det ændrer sig når `scale' øges:
scale=40
1.0000001^(2^27)
674530.4707410845593826891780297458118676556282
scale=60
1.0000001^(2^27)
674530.470741084559382689178029746812844444143410342025985212162090
Så de 10 første cifre ser bestemt troværdige ud her.
De 20 cifres præcision får man i øvrigt lettest ved at starte bc med `bc -l'
i stedet for blot `bc'. Det hele kan gøres stille og let med:
$ bc -lq <-- Tastes
1.0000001^(2^27) <-- Tastes
674530.47074084266695329142 <-- Svar fra bc(1)
$ <-- Tastede Ctrl-D for at afslutte
eller
$ echo '1.0000001^(2^27)' | bc -lq
674530.47074084266695329142
Og det var så dagens bc-lektion...
- --
Ulrik Dickow, Systemprogrammør Kampsax Technology
Tlf: +45 36 39 08 00 Stamholmen 112
Fax: +45 36 77 03 01 DK-2650 Hvidovre
WWW: http://www.kampsax.dk/technology/ Danmark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v0.9.7 (GNU/Linux)
Comment: By Mailcrypt 3.5.2 and GNU Privacy Guard, http://www.gnupg.org
iD8DBQE3Zqto9u7fIBhLxNkRAgYSAKD2oRyXgXcmgV9BZGtXcWHzvX7TvwCeI2hK
TWpanD/+IQvfP3IM40YPfq0=
=rJhL
-----END PGP SIGNATURE-----
References