2010-07-22 142 views
1

这是我曾经发生过的最奇怪的事情,因为我是一个(PHP)程序员...两个文件,完全相同的代码,不同的输出?

我有两个文件,下面的代码(proj.euler的东西),返回不同的输出。

<?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。然而,$theLog拥有正确的价值。

为什么bc函数的行为会从一个文件转换到另一个文件?

注意:在任何文件中都没有设置bcscale,如果将其设置为bcscale(10);,结果完全相同。

+0

如果您将值指定为数组而不是文本块,是否会发生任何更改? – 2010-07-22 11:25:27

+0

你确定这两个文件是一样的吗?你有差异吗?如果是:他们是否在同一个系统上运行? – jigfox 2010-07-22 11:26:51

+0

@Pekka:在知道这个问题之后,我可以告诉你,它可以使用数组而不是heredoc,但在实际情况下,有数百个值,并且不是一个选项。谢谢---------------------------- @Jens:这两个文件都在同一个系统上运行。我没有做任何差异......如果我这样做,我会发现问题。我的坏...但是,考虑到我距离这样做的情况......谢谢 – acm 2010-07-22 13:22:53

回答

3

您的文件中有不同的EOL字符。我可以通过Windows EOL(\r\n)重新编译错误,并使用Unix EOL(\n)更正错误。

+0

这就是问题......一个文件有'\ r'而另一个文件有'\ n' ...我不知道为什么虽然,同样的编辑器正在使用的文件和代码复制粘贴从一个工作到另一个... – acm 2010-07-22 12:55:09

2

有时,当文件看起来相同时,它们可以有不同的编码或行尾。

不能说为什么会影响你的结果。

尝试版本比较它们(如使用WinMerge

使用Notepad++您可以轻松地编辑编码和/或行结束,通过格式菜单。

+0

我使用记事本++和从一个文件复制/粘贴代码到另一个,但是,这是问题... EOL是因此'explode(“\ n”)'将在第一个文件中工作,而'explode(“\ r”)'将在第二个文件中工作......谢谢:) – acm 2010-07-22 12:56:45

相关问题