Ну, мне нужно сделать некоторые вычисления в 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 говорят: «Для поддержки экспоненциальности был добавлен правильный ассоциативный ** оператор».