PHP rekenmachine

Door Toby hinloopen, 12 jaar geleden, 8.055x bekeken

Klein snel-geschreven scriptje dat sommetjes kan uitrekenen, als concurrentie van: http://www.phphulp.nl/php/scripts/2/1726/, welke geen sommen met haakjes kan KON uitrekenen. (is al gefixt zie ik)

Wat kan het:
-Optellen, Aftrekken, Vermenigvuldigen en Delen.
-Macht-berekenen. "2^4" wordt "8". (float of int)
-Vergelijkingen: "2^4=4^2" wordt "true" (boolean)
-Rekenen met getallen binnen het signed 32bit bereik (-2147483648 tot 2147483647), maar werkt in sommige gevallen (afhankelijk van het systeem en het getal) buiten dat bereik.

Wat kan het niet:
-een beveiligingsrisico vormen voor je website
-omgaan met exponentie-getallen, zoals 4e+2. (!)
-wortels trekken (in princiepe zou ik het zo kunnen toevoegen als ik weet welke operator ik daarvoor moet gebruiken)

Voorbeeld van gebruik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
include 'calc.php';
echo calc::ulate('1+1'); //2
echo calc::ulate('2^32-1'); //4294967295
echo calc::ulate('2^(32-1)'); //2147483648
?>

Voorbeeld: http://www.levensweg.net/calc2/

Gesponsorde koppelingen

PHP script bestanden

  1. php-rekenmachine

 

Er zijn 17 reacties op 'Php rekenmachine'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Cornel van der Heiden
Cornel van der Heiden
12 jaar geleden
 
0 +1 -0 -1
Ik vind dit echt een gaaf script. Trouwens, misschien zou je { } kunnen gebruiken voor een wortel ofzo. Maar ja dat is mijn idee.
Karl Karl
Karl Karl
12 jaar geleden
 
0 +1 -0 -1
Ik vind hem eigenlijk niet zo net, aangezien alles in een function is gepropt. Ook doordat het snel geschreven is (dus niet echt heel net, naar mijn idee) is het niet echt een concurrent van dat andere script.
Toby hinloopen
toby hinloopen
12 jaar geleden
 
0 +1 -0 -1
@karl: hij is niet netter inderdaad, maar je kan het ook zien als "hij is niet onnodig ingewikkeld". Ik vraag me af wat de performance is van die andere tegenover die van mij in zowel snelheid als geheugengebruik.
Bas IJzelendoorn
Bas IJzelendoorn
12 jaar geleden
 
0 +1 -0 -1
netjes! en handig!
- Ariën -
- Ariën -
12 jaar geleden
 
0 +1 -0 -1
public static function ulate($input) {

Wat beol je met de ulate function? Dat je te laat bent ergens mee?
Ik snap dat het tof klinkt om hem aan de classname te koppeling met een station function (calc::ulate) maar de naamgeving is dan gewoon niet netjes.
Robert Deiman
Robert Deiman
12 jaar geleden
 
0 +1 -0 -1
Worteltrekken kan met de sqrt() functie van PHP en anders ook door tot de macht 0.5 te gebruiken. 49^0.5 = 7 :)

Een operator in de rekenmachine kan je zelf wat voor bedenken lijkt me?
Pim -
Pim -
12 jaar geleden
 
0 +1 -0 -1
Eerlijk gezegd voel ik me aangesproken wanneer iemand me probeert te verbeteren, kinderachtig, maar ok.
Ten eerste wil ik graag zeggen dat mijn parser modulair is en dus veel gemakkelijker uit te breiden. Ten tweede ondersteunt hij wel 5E-2, wortels, constanten en faculteiten. Ten derde rekent hij 5+345^-6 wél goed uit, dat wordt 5 (de rest valt buiten het float bereik) en niet 1.0930419697004e-15.

Nog een performance testje,
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

$berekening
= '345^(3-4*2-1)';

$timer = explode(' ', microtime());
$before = $timer[1] + $timer[0];

include 'lib.php';

$parser = new Parser();

$parser ->addOperator('Multiply', '*', 2, function($v){return $v[0]*$v[1];})
        ->
addOperator('Plus', '+', 1, function($v){return $v[0]+$v[1];})
        ->
addOperator('Minus', '-', 1, function($v){return $v[0]-$v[1];})
        ->
addOperator('Power', '^', 3, function($v){return pow($v[0],$v[1]);});
        
for($i = 1; $i <= 1000; $i++) {
    $parser->parse($berekening);
}


$timer = explode( ' ', microtime() );
$after = $timer[1] + $timer[0];

$first = $after-$before;

unset($parser, $timer, $before, $after);

$timer = explode(' ', microtime());
$before = $timer[1] + $timer[0];

include 'ander.php';
        
for($i = 1; $i <= 1000; $i++) {
    calc::ulate('2^(32-1)');
}


$timer = explode( ' ', microtime() );
$after = $timer[1] + $timer[0];

$second = $after-$before;

echo $first.'<br>'.$second;
?>

geeft voor 1000 rondes:
0.81795191764832 voor de mijne
0.32167816162109 voor die van jou
Dus wel 2.5 keer zo snel.

Edit: en nog een tip: Gebruik gewoon allemaal statics, ipv die global, is netter
Toby hinloopen
toby hinloopen
12 jaar geleden
 
0 +1 -0 -1
@Pim: hij was geschreven omdat die van jou geen haakjes ondersteunde. Toen ik klaar was zag ik dat je haakjes-support erbij had. Vandaar.

En wat heb je aan een modulaire rekenmachine? :P

Maarja: ja. jouw script is veel mooier. Ik verveelde me gewoon; mag het?
Steen
steen
12 jaar geleden
 
0 +1 -0 -1
Het andere script is dus sneller, uitgebreider en netter. Keuze is snel gemaakt.
Pim -
Pim -
12 jaar geleden
 
0 +1 -0 -1
Haha ja, wat heb je aan een modulaire rekenmachine... xD
Goede vraag. Het betekent iig dat ik niet een enorme waslijst aan functies hoef te maken ;).

En tuurlijk mag je hetzelfde maken als ik doe, maar doe het dan wel beter! (grapje ;)

Maar even inhoudelijk: je kan kan beter direct evaluate aanspreken met een static call en format ook statisch maken, heb je de andere 2 methods helemaal niet nodig.

Edit @steen, nee, dit script is sneller
Dennis de Vries
Dennis de Vries
12 jaar geleden
 
0 +1 -0 -1
3-2(2^5*347)+4
-211105


klopt niet
Stefan
Stefan
12 jaar geleden
 
0 +1 -0 -1
2^5 = 32
32 * 347 = 11104
-2* 11104 = -22208
3 - 22208 = -22205
-22205 + 4 = -22201

Bovenstaande comment klopt dus.


1+1/0 = 1? Oke? Maak daar eens een error message voor. Omdat /0 niet kan.
1+1*0 = 1? Oke? iets * 0 = 0, en niet 1.

Kzie de fout al. Er word niet gewerkt met Hierarchie

()Meneer Van Dalen Wacht Op Antwoord.

Haakjes, Macht, Vermenigvuldigen, Delen, Wortel, Optellen, Aftrekken.
Toby hinloopen
toby hinloopen
12 jaar geleden
 
0 +1 -0 -1
@Stefan:
1+1*0 is wel degelijk 1. Immers, 1*0 heeft voorrang over 1+1, dus 1+1*0 wordt 1+0, wat gelijk is aan 1.

@Dennis:
Wat klopt er niet aan?
edit: owja... ik zie het. Ff kijken.. er zit een serieus foutje in: 2(4)=24. Vaag...
Karl Karl
Karl Karl
12 jaar geleden
 
0 +1 -0 -1
Quote:
Stefan schreef op 15.12.2009 09:25
()Meneer Van Dalen Wacht Op Antwoord.

Haakjes, Macht, Vermenigvuldigen, Delen, Wortel, Optellen, Aftrekken.

Fout. Die klopt niet. Het is Hoe moeten wij van de onvoldoendes afkomen?.
Één bewijs waarom die fout is hierboven al gegeven:
Quote:
Robert_Deiman schreef op 14.12.2009 11:38
Worteltrekken kan met de sqrt() functie van PHP en anders ook door tot de macht 0.5 te gebruiken. 49^0.5 = 7 :)

Machtsverheffing is gelijkwaardig aan worteltrekken. Want 'de' wortel is gelijk aan een macht 1/2. (Standaard wortel twee, kan je de twee weg laten, net zoals bij logaritme. Is tien log.)
Een drie wortel is het zelfde als tot de macht 1/3.
Ook klopt het niet dat delen ondergeschikt is aan vermenigvuldigen, want je kunt bijvoorbeeld keer 1/2 doen en delen door 2.
Cornel van der Heiden
Cornel van der Heiden
12 jaar geleden
 
0 +1 -0 -1
Jullie kunnen allemaal wel gelijk hebben, maar wat heeft het voor zin? Ik bedoel, ik heb thuis ook een Grafische Rekenmachine, en die maakt ook grafiekjes!

Dus echt heel erg nodig vindt ik het ook niet. Als ik nog eens een simpel rekenmachientje voor een site nodig heb, dan pak ik deze, of die van Pim, of dan maak ik er zelf eentje. Simpel!
Victor Php
Victor Php
12 jaar geleden
 
0 +1 -0 -1
Loopt vast bij langere zoals 3+5x5
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Ivo K
Ivo K
12 jaar geleden
 
0 +1 -0 -1
@viktor

Dat is omdat x niet vermenigvuldigen betekent, maar doorgaans een onbekende variabele in de wiskunde. Vermenigvuldigen is *

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. php-rekenmachine

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.