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.
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ä.
Tällä Pythonillako. Asensin sen itselleni eilen. Kuinka desimaaleja saa lisättyä. oletuksena näyttää olevan 12 numeroa.
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.
>>> print 1.0/10**300
1e-300
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.
Tuosta voi olla hyötyä: http://docs.python.org/lib/module-decimal.html
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)
Kiitokset vastauksista. Piti tarkistaa, ovatko nuo piin 10 000 desimaalia oikein.
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.
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.
Kestää tosiaan, Kohta 8 tuntia jauhanu piin desimaaleja vaan ei vieläkään valmista. Mikähän olisi nopsampi kieli tämmöiseen laskentaan?
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.
Nykyraudalla ja C++-toteutuksella miljoona desimaalia pitäisi putkahtaa todistetusti alle puolessa minuutissa. Algoritmillakin on aika paljon väliä.
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 !
Joku Schnell_pi (http://myownlittleworld.com/miscellaneous/
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.
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 ?
Joskus Python tai Perl voi olla noin 25 - 100 kertaa hitaampia kuin C++. Tässä on esimerkki:
http://tenser.typepad.com/
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.