Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Yhtälö

Sivun loppuun

Rocceri [07.09.2009 18:01:37]

#

Tein muutaman erillaisen funktion yhtälön ratkaisemiseen. Jos luvut ovat liian isoja, niin vastaus on esimerkiksi jakoyhtälössä:

x : 166676656436 = 3333823423466
x = 3333823423466 * 166676656436
x = 5.5567054137133E+23

Tässä ollaan kyllä jo tosi isoissa luvuissa, mutta olisihan se kiva tietää, mitä tämä E+23 tarkoittaa, ja miten saisin tuon näkymään normaaleina numeroina.

Teuro [07.09.2009 18:07:30]

#

Se tarkoittaa, että lukua ei kannata ilmoittaa normaalissa muodossa, vaan se esitetään ns. 10-potenssina. Jos muoto 5.56 x 1023 on tuttu, niin tuo on vaihtoehtoinen esimuoto (rankasti pyöristettynä). Mikäli tuokaan ei ole tuttu, niin voit ajatella lukua, jossa 5.56 jälkeen on 24 nollaa.

Mod. korjasi listatagin.

Rocceri [07.09.2009 18:23:23]

#

Juu, en tajunnut että E olisi potenssilasku. No, nyt viisastuin.

Rocceri [07.09.2009 20:01:38]

#

En voinut muokata enään viestiäni, joten kysyn sitten uudella viestillä: Saako PHP:n näyttämään noin suuret luvut?

map_ [07.09.2009 21:26:17]

#

PHP muuttaa noin isot luvut liukuluvuiksi, ja liukulukujenkin tarkkuudella on rajansa.

Yksi tapa on pitää luvut merkkijonoina ja käyttää BC Math-kirjastoa laskuissa. BC Mathia voit pyytämää laskemaan niin tarkasti kuin haluat, eikä se muuta lukua tuollaiseen lyhennysmuotoon.

Metabolix [08.09.2009 21:08:54]

#

Ihan ettei nyt jää väärä käsitys, niin E ei ole potenssilasku, vaan 12.34e56 tarkoittaa 12,34 · 1056. Potenssiin korotetaan siis luku 10 eikä itse näkyvää lukua. Toisin ajateltuna tuo loppuosa kertoo, monenko numeron yli desimaalipilkkua (-pistettä) pitää siirtää. 12.34e1 = 123.4 ja 12.34e-1 = 1.234.

Luvun voi muuttaa tekstiksi sprintf-funktiolla. Kannattaa kuitenkin muistaa, että kokonaisluvun lukualue on rajallinen ja liukuluvut (desimaaliluvut) ovat epätarkkoja, kuten tästäkin esimerkistä näkyy:

<?php
$s = sprintf("%f", 1.2345e67);
# $s = "12345000000000000280007841501019912947901403997040281993972375617536.000000"
?>

Rocceri [09.09.2009 15:18:40]

#

sprintf() ei toiminut minulla, mutta printf toimi (Tulosti tuon vastauksen).

Sitten tuohon map_in vastaukseen: Tuokin toimi hyvin, mutta ongelma on se, että kun käyttäjä syöttää luvun, niin vikaksi paramentiksi pitäisi saada pisteen jälkeiset tiedot luvusta/vastauksesta. Koitin säännöllisillä lausekkeilla laittaa muuttujaan $pituus merkkijonon pisteen jälkeisen tekstin ja laskea sen pituuden strlen() funktiolla - mutta tämä palautta 1, vaikka numeroita oli 8!

peg [09.09.2009 15:21:00]

#

split tai explode

Metabolix [09.09.2009 15:38:55]

#

Rocceri: Jos edes lukisit esimerkkini ajatuksella tai katsoisit manuaalista, mitä sprintf tekee, voisit tajuta, että sprintf palauttaa sen tekstin ja esimerkissäni se sijoitetaan muuttujaan $s.

Päärynämies [09.09.2009 18:18:10]

#

Metabolix kirjoitti:

12.34e1 = 1.234 ja 12.34e-1 = 123.4

Näissä ilmeisesti tullut pienoinen näppäilyvirhe? 12.34e1 = 12.34 * 10^1 = 123.4 ja vastaavasti 12.34e-1 = 1.234

Metabolix [09.09.2009 18:39:22]

#

Päärynämies kirjoitti:

Näissä ilmeisesti tullut pienoinen näppäilyvirhe?

Niinpä oli.


Sivun alkuun

Vastaus

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

Tietoa sivustosta