2010-07-22 3 views
1

이것은 (PHP) 프로그래머이기 때문에 나에게 가장 이상한 일이다 ...두 개의 파일, 정확히 동일한 코드, 다른 출력?

다른 출력을 반환하는 다음 코드 (proj. euler stuff)가있는 두 개의 파일이 있습니다.

<?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에, $result = bcmul($theLog,$expo,10); 가짜 하나, $theLog 따라서 bcmul(0,$expo) = 0, float 치를 것을 좋아하지 않는 것을 알 수 있습니다. 그러나 $theLog은 올바른 값을 유지합니다.

왜 bc 함수의 동작이 한 파일에서 다른 파일로 변경됩니까?

참고 : 어떤 파일에도 bcscale이 설정되어 있지 않으며 bcscale(10);으로 설정하면 결과가 동일합니다.

+0

값을 텍스트 블록 대신 배열로 지정하면 아무 것도 바뀌지 않습니까? –

+0

정말 두 파일이 같은가요? diff를 만들었습니까? 예 : 동일한 시스템에서 실행되고 있습니까? – jigfox

+0

@Pekka : 문제를 알게 된 후, heredoc 대신 배열을 사용할 수 있다고 말할 수 있습니다. 그러나 실제로는 수백 가지의 값이 있으며 옵션이 아닙니다. 감사합니다 ---------------------------- @Jens : 두 파일이 같은 시스템에서 실행되고있었습니다. 나는 어떤 diff도하지 않았다. .. 내가했다면 나는 문제를 발견했을 것이다. 내 나쁜 ...하지만 상황을 감안할 때 나는 그것을하고 마일 ... 감사합니다 – acm

답변

3

파일에 다른 EOL 문자가 있습니다. Windows EOL (\r\n)을 사용하여 오류를 재현하고 Unix EOL (\n)의 문제를 해결할 수 있습니다.

+0

그게 정확히 문제는 ... 하나의 파일은'\ r'은 다른 반면 '\ n'은 ... 왜 그런지 모르겠다 그래도 파일과 코드 모두에 사용되는 동일한 편집기는 다른 하나에서 작동하는 사본을 붙여 넣었습니다. – acm

2

때때로 파일이 동일하게 보일 때 서로 다른 인코딩 또는 줄 끝을 가질 수 있습니다.

귀하의 결과에 영향을 미칠 이유는 말할 수 없습니다.

( WinMerge를 사용하는 예.)

을 diffing의 시도

서식 메뉴를 통해 쉽게 인코딩 및/또는 라인 엔딩을 편집 할 수 있습니다 Notepad++ 사용.

+0

메모장을 사용하고 있었지만 한 파일에서 다른 파일로 복사/붙여 넣은 코드가 문제였습니다 ... EOL은 different 그러므로'explode ("\ n")'는 첫 번째 파일에서 작동하고'explode ("\ r")'는 두 번째 파일에서 작동합니다 ... 감사합니다 :) – acm

관련 문제