Возведение к власти в PHP

Ну, мне нужно сделать некоторые вычисления в скрипте 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.

Excel и Wolfram Mathematica дают ответ ~0,977237.

Какие-либо предложения?


person Kuroki Kaze    schedule 31.07.2009    source источник


Ответы (5)


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

person soulmerge    schedule 31.07.2009

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

До 5.6:

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

5.6 и выше:

$power = 2 ** 3;

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

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

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

$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
person silkfire    schedule 26.02.2014
comment
Все это делает меня грустным. Приоритет унарного оператора и выбор оператора настолько близки к *, что их легко опечатать. - person Kzqai; 18.08.2014

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

var_dump(pow(10, -0.01));  // float(0.977237220956)
person Gumbo    schedule 31.07.2009
comment
И похоже, что gmp_pow принимает только положительные степени. Конечно, мы можем преобразовать в 1/gmp_pow('10', '.01') :) - person Kuroki Kaze; 31.07.2009

функция bcpow поддерживает только целые показатели степени. Вместо этого попробуйте использовать pow.

person Rob    schedule 31.07.2009

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

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

person Ali Gajani    schedule 30.04.2014