Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Lukujärjestelmien muunnoksen tarkkuus

Jaska [14.01.2006 18:12:36]

#

Minun pitäisi omassa ohjelmointiprojektissani tehdä luikuluvuilla laskeva ohjelma. Nyt ongelmaksi tuli se, että en tiedä kuinka paljon menetän tarkkuutta kun muunnan desimaalilukuja binäärijärjestelmän luvuiksi ja päinvastoin. Miten pystyn varmistumaan (matemaattinen todistus olisi kiva), että jos muunnan vaikkapa Neperin luvun e kaksijärjestelmään, suoritan siellä laskutoimituksia, ja muutan tuloksen takaisin kymmenjärjestelmään, että tulos olisi oikea vaikkapa ensimmäisten n desimaalin tarkkuudella?

panttu [14.01.2006 21:02:20]

#

Katso kyseusen kielen helpistä, kuinka monen desimaalin tarkkuudella luku on kyseisessä tyypissä.
Täälät näet esimerkiski miten .NETin tietotyypeissä on merkitseviä numeroita. http://www.csharp-station.com/Tutorials/Lesson02.aspx

Jos ongelma pitää ratkaista ohjelmallisesti, niin yksi vaihtoehto voisi olla joku seuraavan tapainen

double d = d.MaxValue;
tai d = 3.1415...;
string s = d.ToString();
int merkitseviäNumeroita = LaskeNumeroidenMääräEnnenEksponenttia(s);

Metabolix [14.01.2006 21:18:04]

#

Sehän menee logaritmeilla. Eli yksi a-järjestelmän numero vastaa log(a) / log(b) b-järjestelmän numeroa.

log(10) / log(2) = 3,322. (Suunnilleen, tietenkin.) Siitä sitten pyöristät ylöspäin. Jos kyseessä on kymmenkantainen logaritmi, log(10) on yksi, ja jos taas kaksikantainen, niin log(2) on yksi. Eli silloin ei tarvitse laskea molempia. Tietenkin fiksussa toteutuksessa lasketaan tarvittava kerroin alussa ja ylöspäin pyöristettynä.

Kokeellinen "todistus" on testata, monesko bitti luvusta on päällä, kun se on tietyn suuruinen. Esim. 999 = 1111100111, päällä on siis kymmenes bitti. Kolme numeroa vaativat sen verran. 3 * log(10) / log(2) on hieman alle kymmenen.

Muista myös tietyissä laskuissa kuljettaa riittävän suurta häntää perässä. Kertolaskuja sisältävät lauseet antavat hyvinkin eri tuloksia, jos luku välissä lyhennetään tiettyyn desimaalimäärään.

Jaska [15.01.2006 00:01:48]

#

No niinpät tietysti. Kuinka saatoinkaan unohtaa logaritmit! Ilmeisesti rutiini puuttuu liukulukumuunnoksista.

Muistan kyllä ottaa mukaan riittävän tarkkuuden. Oikeastaan halusinkin ohjelmasta sellaisen, että siinä on varmasti vastauksen oikean arvon ja likiarvon välisen erotuksen itseisarvo ennalta määrättyä lukua pienempi.

Vastaus

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

Tietoa sivustosta