Eräässä projektissa tuli vastaan outo tapaus, php ei laskenut laskua "10^2+3" oikein. Aikani pähkäilin, että mikä on vikana, huomasin, ettei php:ssa ole ollenkaan potenssi-operaattoria. Olenkohan nyt oikeassa, potenssihan on niin perusjuttu laskutoimituksissa?
Koska halusin saada potenssit toimimaan, aloin tehdä funktioita, joka muuttaisi potenssilaskut kertolaskun muotoon. Funktiota en saanut kuitenkaan toimimaan ja se oli todella purkka. Tekniikkana oli, että laskua käytiin merkki merkiltä läpi. Tähän on varmasti jokin parempi keino ja mieleeni ei tullut kuin säännölliset lausekkeet. Säännöllisiä lausekkeita en kuitenkaan hallitse, niin toivoisin, että joku voisi antaa toimivan funktion tähän tai edes idean, jotta voisin tehdä funktion itse.
No voi nyt, olenpas hieman sokea, kiitos. Nyt toimii.
Mutta tuolle funktiolle, mikä muuttaa x^y-muotoiset lausekkeet kertolaskumuotoon olisi käyttöä.
^-operaattorihan on PHP:ssä bitwise-operaattori xor:
https://www.php.net/manual/en/language.
Tässä pieni funktion pätkä, joka suorittaa potenssiinkorotukset merkkijonossa (ei siis korvaa niitä kertolaskuilla, vaan sijoittaa suoraan tulokset merkkijonoon):
<?php function parse_pow($lauseke) { while (1) { // Vaihtoehtoinen toteutus substr_count() ja for if (($sijainti = strpos($lauseke, "^")) === FALSE) break; // Lopetetaan silmukka, kun yhtään ^-merkkiä ei ole jäljellä // Käytetään PHP:n omaa muunnosmagiikkaa lukujen selvittämiseksi $luku1 = (float) strrev((float) strrev(substr($lauseke, 0, $sijainti))); $luku2 = (float) substr($lauseke, $sijainti + 1); // Selvitetään potenssiinkorotusta edeltävä osa ja sen jälkeinen osa $patka1 = substr($lauseke, 0, $sijainti - strlen($luku1)); $patka2 = substr($lauseke, $sijainti + 1 + strlen($luku2)); // Liimataan kaikki yhteen return($patka1 . pow($luku1, $luku2) . $patka2); } } ?>
Koodi testattu.
Jes, tuollaista juuri etsin. Tuo on suhteellisen lyhyt verrattuna siihen, mitä omastani olisi tullut. Kiitos!
EDIT: Paitsi, että tuo ei tue sulkeita tyyliin (-2)^2, tuosta tulee (-20.
Aihe on jo aika vanha, joten et voi enää vastata siihen.