Ну, мне нужно сделать некоторые вычисления в 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.
Какие-либо предложения?
Каретка – это бит-мудрый оператор XOR в PHP. Вам нужно использовать pow()
для целых чисел.
PHP 5.6, наконец, ввел врожденный оператор мощности, обозначенный двойной звездочкой ( **
) – не путать с ^
, побитым оператором 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
Оператор ^
является побитовым оператором XOR . Вы должны использовать либо pow
, bcpow
либо gmp_pow
:
var_dump(pow(10, -0.01)); // float(0.977237220956)
Функция bcpow поддерживает только целые показатели. Вместо этого попробуйте использовать pow .
Начиная с 2014 года и обновления PHP 5.6 alpha, есть много включенных функций, которые, я надеюсь, делают его окончательной версией PHP. Это оператор **
.
Таким образом, вы можете сделать 2 ** 8
вы получите 256
. PHP Docs говорят: «Для поддержки экспоненциальности был добавлен правильный ассоциативный **
оператор».