Два файла, точно такой же код, разные выходные данные? - PullRequest
1 голос
/ 22 июля 2010

Это самая странная вещь, которая когда-либо случалась со мной, так как я программист (PHP) ...

У меня есть два файла со следующим кодом (proj. Euler stuff), которые возвращают разные результаты.

<code><?php
$numbers =<<<eot
2,3
5,2
9,3
4,9
6,3
10,5
eot;
$numbers = explode("\n",$numbers);
$max = 0;
foreach($numbers as $k => $n){
    list($base,$expo) = explode(',',$n);
    $theLog = log($base,10);
    $result = bcmul($theLog,$expo,10);

    if(bccomp($result,$max,10) == 1){
        echo '<br/>max so far is ' . $result . ' for base ' . $base . '[log:'.$theLog.'] and exponent ' . $expo ;
        $max = $result;
    }
}
echo '<pre>';
print_r($numbers);
echo '
';echo $ max;

FILE1, euler.php // выводит как ожидалось:

max so far is 0.9030899869 for base 2[log:0.30102999566398] and exponent 3
max so far is 1.3979400086 for base 5[log:0.69897000433602] and exponent 2
max so far is 2.8627275283 for base 9[log:0.95424250943932] and exponent 3
max so far is 5.4185399219 for base 4[log:0.60205999132796] and exponent 9

5.4185399219

FILE2, euler2.php // фиктивный вывод:

max so far is 5 for base 10[log:1] and exponent 5

5

Может кто-нибудь придумать вескую причину для этого?

Я проверил это и могу сказать, что в euler2.php, фиктивная, $result = bcmul($theLog,$expo,10);не нравится, когда $theLog является значением с плавающей точкой, поэтому bcmul(0,$expo) = 0.$theLog, однако, содержит правильное значение.

Почему поведение функций bc меняется с одного файла на другой?

ПРИМЕЧАНИЕ. * Ни в одном из файлов не установлено значение bcscale.и если я установлю его на bcscale(10);, результат будет точно таким же.

Ответы [ 2 ]

3 голосов
/ 22 июля 2010

В ваших файлах разные символы EOL. Я могу воспроизвести вашу ошибку с Windows EOL (\r\n) и исправить поведение с Unix EOL (\n).

2 голосов
/ 22 июля 2010

Иногда, когда файлы выглядят одинаково, они могут иметь разные кодировки или окончания строк.

Хотя не могу сказать, почему это повлияет на ваш результат.

Попробуйте их различить (например, используя WinMerge )

Используя Блокнот ++ , вы можете легко редактировать кодировку и / или окончания строк через меню Формат.

...