Точность Php с плавающей точкой - сложное уравнение = 1 - PullRequest
0 голосов
/ 12 ноября 2008

У меня есть следующее уравнение

1 - ((.5 * 0,83333333333333) ^ 2 + (.5 * 0,83333333333333) ^ 2 + (.5 * (1 - 0,83333333333333)) ^ 2 + (.5 * (1 - 0,83333333333333)) ^ 2)

В Php5 это приводит к ответу 1 вместо 0,63 (на двух машинах, OSx и Centos). Должен ли я использовать исключительно математические функции Php в Php для выполнения подобных уравнений?

Ответы [ 3 ]

5 голосов
/ 12 ноября 2008

Я думаю, что, возможно, вам следует использовать pow () вместо оператора xor (^) :)

1 голос
/ 12 ноября 2008
<?php

$hugeDamnEquation = pow(1 - ((.5 * 0.83333333333333), 2) + pow((.5 * 0.83333333333333), 2) + pow((.5 * (1 - 0.83333333333333)), 2) + pow((.5 * (1 - 0.83333333333333)), 2));

echo $hugeDamnEquation;

?>
1 голос
/ 12 ноября 2008

Не совсем уравнение, но это семантика. Кроме того, я сомневаюсь, что вы имеете в виду XOR, так что я предполагаю, что это не то, что вы хотите. В любом случае, вы можете использовать рациональную арифметику?

0,83333 можно преобразовать в дробь (при условии, что 3 является повторяющимся десятичным числом):

 83.3333333 = 100x
  8.3333333 = 10x
 -----------------
         75 = 90x
     x = 75 / 90 = 0.83333...

Таким образом, вы имеете дело только с целыми числами, и до тех пор, пока оба значения не переполняются (вы можете уменьшить GCD до и после операций), все будет в порядке.

...