← Back to team overview

sslug-teknik team mailing list archive

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