Question

Eh bien, je dois faire quelques calculs en script PHP. Et j’ai une expression qui se comporte mal.

echo 10^(-.01);

Sorties 10

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

Sorties 0

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

Sorties 1

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

Sorties 1 000 ....

J'utilise bcscale (100) pour les calculs BCMath.

Excel et Wolfram Mathematica ont répondu ~ 0,977237.

Des suggestions?

Était-ce utile?

La solution

Le curseur est un opérateur XOR en PHP. Vous devez utiliser pow () pour les entiers.

Autres conseils

PHP 5.6 a finalement introduit un opérateur de puissance innée, signalé par un double astérisque ( ** ) - à ne pas confondre avec ^ , l'opérateur XOR au niveau du bit.

Avant la 5.6:

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

5.6 et plus:

$power = 2 ** 3;

Un opérateur d'affectation est également disponible:

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

Après de nombreuses discussions et votes, il a été décidé que l'opérateur serait associatif à droite (pas à gauche) et que sa priorité était supérieure à l'opérateur pas au niveau du bit ( ~ ).

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

De plus, pour une raison qui n’a pas beaucoup de sens pour moi, la puissance est calculée avant l’opérateur négatif ( - ), donc:

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

L'opérateur ^ est le bitwise Opérateur XOR . Vous devez utiliser pow , bcpow ou gmp_pow :

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

La la fonction bcpow ne prend en charge que les exposants d'entiers. Essayez plutôt d'utiliser pow .

À partir de 2014 et de la mise à jour alpha PHP 5.6, il existe une fonctionnalité importante qui, j'espère, en fera la version finale de PHP. C'est l'opérateur ** .

Vous pouvez donc utiliser 2 ** 8 pour obtenir 256 . Les documents PHP indiquent: Un opérateur ** associé de droite a été ajouté pour prendre en charge l’exponentiation " ;.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top