2009-07-31 8 views
3

Nun, ich muss einige Berechnungen in PHP-Skript durchführen. Und ich habe einen Ausdruck, der sich falsch verhält.Raising an die Macht in PHP

echo 10^(-.01); 

Ausgänge 10

echo 1/(10^(.01)); 

Ausgänge 0

echo bcpow('10', '-0.01') . '<br/>'; 

Ausgänge 1

echo bcdiv('1', bcpow('10', '0.01')); 

Ausgänge 1.000 ....

Ich verwende bcscale(100) für BCMath-Berechnungen.

Excel und Wolfram Mathematica geben Antwort ~ 0,977237.

Irgendwelche Vorschläge?

Antwort

4

Die ^ operator is the bitwise XOR operator. Sie müssen entweder pow, bcpow oder gmp_pow:

var_dump(pow(10, -0.01)); // float(0.977237220956) 
+0

Ich versuchte mit bcpow. Kein Glück. –

+2

Und es scheint wie gmp_pow akzeptiert nur positive Kräfte. Natürlich können wir in 1/gmp_pow ('10 ',' .01 ') umwandeln :) –

6

PHP 5.6 führte schließlich einen angeborenen Energieoperator ein, notiert durch einen Doppelstern (**) - nicht zu verwechseln mit ^, dem bitweisen XOR-Operator.

Vor 5.6:

$power = pow(2, 3); // 8 

5,6 und höher:

$power = 2 ** 3; 

Ein Zuweisungsoperator ist auch verfügbar:

$power = 2 ** 2; 
$power **=  2; // 8 

Durch viele Diskussionen und Abstimmungen, wurde beschlossen, dass die Der Operator wäre rechtsassoziativ (nicht links) und die Operatorenpriorität liegt über der Bitweise nicht Operator (~).

$a = 2 ** 3 ** 2; // 512, not 64 because of right-associativity 
$a = 2 ** (3 ** 2); // 512 

$b = 5 - 3 ** 3; // -22 (power calculated before subtraction) 

Auch aus irgendeinem Grund, dass nicht viel Sinn für mich macht, die Leistung vor dem Negieren unärer Operator berechnet (-), also:

$b = -2 ** 2;  // -4, same as writing -(2 ** 2) and not 4 
+0

Das alles macht mich traurig. Die Priorität des unären Operators und die Wahl des Operators, so nah wie möglich an "*", um leicht typisiert zu werden. – Kzqai

0

Ab 2014 und Das PHP 5.6 Alpha-Update, es gibt eine viel enthaltene Funktion, die hoffentlich bis zur endgültigen Veröffentlichung von PHP reicht. Es ist der Operator **.

So können Sie tun 2 ** 8 erhalten Sie 256. PHP Docs sagen: "Ein rechts assoziativer Operator ** wurde hinzugefügt, um die Potenzierung zu unterstützen".