Подъем к власти в PHP - PullRequest
3 голосов
/ 31 июля 2009

Ну, мне нужно сделать некоторые вычисления в сценарии PHP. И у меня есть одно выражение, которое ведет себя неправильно.

echo 10^(-.01);

Выходы 10

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

Выходы 0

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

Выходы 1

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

Выходы 1.000 ....

Я использую bcscale(100) для расчетов BCMath.

Эксель и Вольфрам Математика дают ответ ~ 0,977237.

Есть предложения?

Ответы [ 5 ]

11 голосов
/ 31 июля 2009

Символ каретки - побитовый оператор XOR в PHP. Вам нужно использовать pow() для целых чисел.

6 голосов
/ 26 февраля 2014

В PHP 5.6 наконец-то появился врожденный оператор power, отмеченный двойной звездочкой (**) - не путать с ^, побитовым оператором XOR.

До 5.6:

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

5,6 и выше:

$power = 2 ** 3;

Оператор присваивания также доступен:

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

В ходе многочисленных обсуждений и голосования было решено, что оператор будет ассоциативно-правым (не левым), и его приоритет оператора будет выше побитового оператора, а не (~).

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

Кроме того, по какой-то причине, которая не имеет для меня особого смысла, мощность вычисляется до отрицательного унарного оператора (-), таким образом:

$b = -2 ** 2;        // -4, same as writing -(2 ** 2) and not 4
4 голосов
/ 31 июля 2009

Оператор ^ является побитовым оператором XOR . Вы должны использовать pow, bcpow или gmp_pow:

var_dump(pow(10, -0.01));  // float(0.977237220956)
0 голосов
/ 30 апреля 2014

Начиная с 2014 года, и альфа-обновления PHP 5.6, есть много встроенных функций, которые, я надеюсь, появятся в финальной версии PHP. Это оператор **.

Так что вы можете сделать 2 ** 8 получите вас 256. Документы PHP говорят: «Правильный ассоциативный оператор ** был добавлен для поддержки возведения в степень».

0 голосов
/ 31 июля 2009

Функция bcpow поддерживает только целочисленные показатели. Попробуйте использовать pow .

...