Pregunta

Bueno, necesito hacer algunos cálculos en el script PHP. Y tengo una expresión que se comporta mal.

echo 10^(-.01);

Salidas 10

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

Salidas 0

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

Salidas 1

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

Salidas 1.000 ....

Estoy usando bcscale (100) para los cálculos de BCMath.

Excel y Wolfram Mathematica dan respuesta ~ 0,977237.

¿Alguna sugerencia?

¿Fue útil?

Solución

El cursor es el operador XOR en PHP. Debe usar pow () para enteros.

Otros consejos

PHP 5.6 finalmente introdujo un operador de energía innato, anotado por un doble asterisco ( ** ), que no debe confundirse con ^ , el operador XOR bit a bit.

Antes 5.6:

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

5.6 y superior:

$power = 2 ** 3;

Un operador de asignación también está disponible:

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

A través de muchas discusiones y votaciones, se decidió que el operador sería asociativo a la derecha (no a la izquierda) y su precedencia de operador está por encima del bit a bit no operador ( ~ ).

$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)

Además, por alguna razón que no tiene mucho sentido para mí, la potencia se calcula antes del operador unario ( - ), por lo tanto:

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

El operador ^ es el operador bit a bit Operador XOR . Debe usar pow , bcpow o gmp_pow :

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

La función bcpow solo admite exponentes enteros. Intente utilizar pow en su lugar.

A partir de 2014, y la actualización alfa PHP 5.6, hay una característica muy incluida que espero llegue a la versión final de PHP. Es el operador ** .

Para que pueda hacer 2 ** 8 obtendrá 256 . Los documentos PHP dicen: "Se ha agregado un operador ** asociativo derecho para admitir la exponenciación".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top