1

これは、私が (PHP) プログラマーになって以来、私に起こった最も奇妙なことです...

異なる出力を返す次のコード (proj.euler のもの) を含む 2 つのファイルがあります。

<?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 '</pre>';
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 では、float 値であることを$result = bcmul($theLog,$expo,10);好まないことがわかりました。ただし、正しい値を保持します。$theLogbcmul(0,$expo) = 0$theLog

ファイルごとに bc 関数の動作が変わるのはなぜですか?

注:bcscaleどのファイルにも設定はありません。設定した場合bcscale(10);、結果はまったく同じです。

4

2 に答える 2

3

ファイルに異なる EOL 文字が含まれています。Windows EOL ( ) でエラーを再現\r\nし、Unix EOL ( ) で正しい動作を再現できます\n

于 2010-07-22T11:32:05.630 に答える
2

ファイルが同じように見えても、エンコーディングや行末が異なる場合があります。

ただし、それが結果に影響する理由はわかりません。

それらを比較してみてください(例:WinMergeを使用)

Notepad++を使用すると、[フォーマット] メニューからエンコーディングや行末を簡単に編集できます。

于 2010-07-22T11:34:10.820 に答える