Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Tosipitkät liukuluvut

Sivun loppuun

setä [20.11.2006 13:37:27]

#

Pythonilla pääsee suoraan käsittelemään pikiä kokonaislukuja. Onnistuuko myös jotenkin tosi pitkät liukuluvut, esim. 10 000 desimaalia. Jos ei niin millä sitten. Mikä olisi näppärä kieli matemaattisiin tehtäviin kun on hinku tosi pitkiin liukulukuihin.

ezuli [20.11.2006 16:26:12]

#

Itselläni näyttäisi menevän ~320 desimaaliin.

Tietenkin niitä voi jotenkin paloittain käsitellä vaikka kuinka pitkälle, muistan täälläkin joskus nähneeni siitä esimerkkejä.

setä [20.11.2006 17:52:15]

#

Tällä Pythonillako. Asensin sen itselleni eilen. Kuinka desimaaleja saa lisättyä. oletuksena näyttää olevan 12 numeroa.

ezuli [20.11.2006 18:12:13]

#

0.01 muodossa desimaaleja näyttäisi saavan tulostettua vain 66, yli 300 pääsee 1e-100 muodossa.

Nuo koot on Pythonissa rajoitettu vain koneen tehojen mukaan, eli ne ei ole kiinteitä.

>>> print "%.66f" % (1.0/10**66)
0.000000000000000000000000000000000000000000000000000000000000000001

>>> print 1.0/10**300
1e-300

Jaska [20.11.2006 18:17:54]

#

Minä tykkää C++:sta. Ainakin osoitteessa http://www.swox.com/gmp/ löytyy kirjasto, jolla voi laskea liukuluvuilla. Joskus tein tuollaisen itsekin, mutta se oli melko hidas. En tiedä, miten voin muuntaa mahdollisimman nopeasti lukuja 10-järjestelmästä 2-järjestelmään ja takaisin, jos ei ole valmiita funktioita käytössä. Tietorakenteeni käytin linitettyä listaa.

Chiman [20.11.2006 18:41:54]

#

Tuosta voi olla hyötyä: http://docs.python.org/lib/module-decimal.html

ezuli [20.11.2006 19:14:46]

#

Kappas, en olekaan vielä ehtinyt tutkia lisämoduleita.
Hyvin näyttää toimivan, eikä 10000 desimaalilla ole vielä tolkuttoman hidas.

import decimal
decimal.getcontext().prec = 10**4
print 1/decimal.Decimal(3)

setä [20.11.2006 19:52:13]

#

Kiitokset vastauksista. Piti tarkistaa, ovatko nuo piin 10 000 desimaalia oikein.

koo [21.11.2006 01:55:47]

#

Semmoinen juttu vaan, että näissä liukuluvuissa desimaalien määrä tai siis arvoalue on aika lailla eri juttu kuin tarkkuus. Ja sitten luvun tulostaminen on vielä ihan erikseen.

Vaikka liukuluvun arvoalue olisikin esmes plusmiinus 2.2250738585072014e-308 .. 1.7976931348623158e+308 ja 0, tarkkuutta ei ole välttämättä kuin noin 16 desimaalin verran.

setä [21.11.2006 09:10:55]

#

Kyse on numeroiden määrästä johon ei lueta etu- eikä takanollia. Siis tarkkuus, ei arvoalue.
Tuo Pythonin decimal-lisuke pelaa hienosti. Murtoluvun laskenta ja tulostus 10000 decimaalilla vajaa puoli sekuntia. Piin laskeminen 10000 desimalin tarkkuudella kestänee tunteja.

setä [22.11.2006 15:39:20]

#

Kestää tosiaan, Kohta 8 tuntia jauhanu piin desimaaleja vaan ei vieläkään valmista. Mikähän olisi nopsampi kieli tämmöiseen laskentaan?

Jaska [22.11.2006 16:54:17]

#

Oletko setä varma, että vika on Pythonin nopeudessa? Piille on olemassa monia laskukaavoja, josta toiset ovat hyvin hitaita ja toiset hyvinkin nopeita. Mahdollisimman koneenläheinen kieli on tietysti nopeampi kuin Python. Itse en jaksa uskoa, että Python olisi niin hidas, että sillä kestäisi kahdeksan tuntia laskea kymmentätuhatta desimaalia esimerkiksi Borweinin algoritmilla. Assembly on varmaan nopeampi kuin Python, samoin varmaan C.

Ihan uteliaisuudesta, mihin tarvitset piin 10000:tta desimaalia? Minulle riittää yleensä kaksi.

Täältä löytyy piin 10000 ensimmäistä desimaalia alle kahdeksassa tunnissa.

koo [22.11.2006 17:17:31]

#

Nykyraudalla ja C++-toteutuksella miljoona desimaalia pitäisi putkahtaa todistetusti alle puolessa minuutissa. Algoritmillakin on aika paljon väliä.

setä [22.11.2006 17:34:35]

#

Borweinin algoritmia käytänkin. Kyllä nuo 10000 desimaalia ovat tiedossa mutta kiinnostaa selvittää kuinka ne voi laskea ja paljonko menee aikaa. (AMD Athlon XP 1800+). Kohta 10 tuntia eikä vieläkään valmis. Tuskin ihan kotikoneilla onnistuu miljoona desimaalia alle puolen minuutin !

sooda [22.11.2006 17:57:29]

#

Joku Schnell_pi (http://myownlittleworld.com/miscellaneous/computers/pilargetable.html -> http://myownlittleworld.com/miscellaneous/computers/files/pi-programs/linux/Schnell_pi_1.0.tgz) laskee näköjään mun koneella (AthlonXP 2400+) reilu miljoona desimaalia (1048550 kpl) 7.8 sekunnissa (tärkeimmällä prioriteetilla ~7.3s). 4M desimaalia 41 sek, 8M 89 sek. Aikamoinen vauhti.

koo [22.11.2006 19:14:49]

#

setä kirjoitti:

Tuskin ihan kotikoneilla onnistuu miljoona desimaalia alle puolen minuutin !

Kolmisen vuotta vanhalla läppärillä näytti kyllä tulevan tällaisia tuloksia:

    desimaaleja     1000   10000  100000 1000000
    sekunteja       0.02    0.32    5.52   77.36

Kun lasketut miljoona desimaalia sitten tulosti Windows XP:n komentoikkunassa, aikaa kului vajaat 11 s lisää.

Ei tosiaan mennyt alle puolen minuutin, mutta eiköhän jonkun kotona ole sellainenkin kone, että menee.

Epäilijät voivat tutustua itsekin apfloat-pakettiin.

setä [22.11.2006 19:22:02]

#

No voihan ihme ! Heitin jo Pythonin jorpakkoon. Kone kaatui lähes 11 tunnin ähellyksen jälkeen ja jumitti muita toimintoja. Pitääkö tässä vanhan opetella vielä C++ ? Onko kellään kokemusta Powerbasicista ?

Pekka Karjalainen [23.11.2006 13:34:23]

#

Joskus Python tai Perl voi olla noin 25 - 100 kertaa hitaampia kuin C++. Tässä on esimerkki:

http://tenser.typepad.com/tenser_said_the_tensor/2006/08/python_vs_perl_.html

Tästä voisi Setä lueskella sen verran, että selviää mikä kirjoittajan kokemuksien mukaan tekee tässä tapauksessa Pythonista niin paljon hitaampaa. Joskus hitauden aiheuttajan voi kiertää ja päästä kohtuullisen nopeaan Python-ratkaisuun. Kirjoittajan kuvaamassa tilanteessa se kai ei vain onnistunut mitenkään.

Freebasic näyttäisi antavan aika nopeita ohjelmia. Lähes täysin merkityksettömät Aliothin shootout-testit antavat sille hyvän sijoituksen:

Pitkä linkki piilotettu tägiin

Itse asiassa piin desimaalien laskeminen on yksi näistä testeistä, joten tässä tapauksessa mitatulla nopeudella voisi olla Sedälle merkitystä.

Ei kuitenkaan kannata ottaa noita testejä liian tosissaan. Niissä mitataan valmiiksi tehtyjä ja ymmärrettyjä ohjelmia: oikeassa tilanteessa se pitää ohjelmakin tehdä itse ja kehitysaika & kulut on hyvä ottaa laskuissa huomioon. Siinä kielen valinnalla ja omilla taidoilla on suurin merkitys.

No niin, takaisin lurkkimaan. Sainpa jaariteltua.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta