Aumentare al potere in PHP
-
06-07-2019 - |
Domanda
Bene, devo fare alcuni calcoli nello script PHP. E ho un'espressione che si comporta male.
echo 10^(-.01);
Output 10
echo 1 / (10^(.01));
Output 0
echo bcpow('10', '-0.01') . '<br/>';
Output 1
echo bcdiv('1', bcpow('10', '0.01'));
Output 1.000 ....
Sto usando bcscale (100)
per i calcoli BCMath.
Excel e Wolfram Mathematica danno una risposta ~ 0,977237.
Qualche suggerimento?
Soluzione
Il cursore è il bit operatore XOR in PHP. Devi utilizzare pow ()
per numeri interi.
Altri suggerimenti
PHP 5.6 ha finalmente introdotto un innato power operator, annotato da un doppio asterisco ( **
) - da non confondere con ^
, l'operatore XOR bit a bit.
Prima della 5.6:
$power = pow(2, 3); // 8
5.6 e versioni successive:
$power = 2 ** 3;
È disponibile anche un operatore di assegnazione:
$power = 2 ** 2;
$power **= 2; // 8
Attraverso molte discussioni e votazioni, è stato deciso che l'operatore sarebbe stato associativo a destra (non a sinistra) e la precedenza dell'operatore è sopra l'operatore bit a bit non ( ~
).
$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)
Inoltre, per qualche motivo che non ha molto senso per me, la potenza viene calcolata prima dell'operatore unario negatore ( -
), quindi:
$b = -2 ** 2; // -4, same as writing -(2 ** 2) and not 4
L'operatore ^
è bit a bit Operatore XOR . Devi utilizzare pow
, bcpow
o gmp_pow
:
var_dump(pow(10, -0.01)); // float(0.977237220956)
La funzione bcpow supporta solo esponenti interi. Prova invece a utilizzare pow .
A partire dal 2014, e l'aggiornamento alfa di PHP 5.6, c'è una funzionalità molto inclusa che spero arrivi alla versione finale di PHP. È l'operatore **
.
Quindi puoi fare 2 ** 8
per ottenere 256
. PHP Docs afferma: "Un operatore associativo **
associato è stato aggiunto per supportare l'espiazione".