【问题标题】:Two files, exactly the same code, different output?两个文件,完全相同的代码,不同的输出?
【发布时间】:2011-03-19 12:07:27
【问题描述】:

这是自从我成为(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);,结果完全相同。

【问题讨论】:

  • 如果将值指定为数组而不是文本块,会有什么变化吗?
  • 你确定这两个文件是一样的吗?你做了差异化吗?如果是:它们是否在同一系统上运行?
  • @Pekka:在了解了这个问题后,我可以告诉你,使用数组而不是 heredoc 是可行的,但在实际情况下,有数百个值并且不是一个选项。谢谢---------------------------- @Jens:两个文件都在同一个系统上运行。我没有做任何差异……如果我这样做了,我会发现问题的。我的错...但是考虑到我距离这样做还有很长的路要走...谢谢

标签: php heredoc bcmath


【解决方案1】:

您的文件中有不同的 EOL 字符。我可以使用 Windows EOL (\r\n) 重现您的错误,并使用 Unix EOL (\n) 纠正行为。

【讨论】:

  • 这正是问题所在......一个文件有\r,而另一个有\n......我不知道为什么,文件和代码都使用相同的编辑器被复制粘贴从一个工作到另一个...
【解决方案2】:

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

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

尝试区分它们(例如使用WinMerge

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

【讨论】:

  • 我使用记事本++并将代码从一个文件复制/粘贴到另一个文件,但这就是问题所在... EOL 不同,因此explode("\n") 将在第一个文件中工作,而explode("\r") 将在第一个文件中工作第二个文件...谢谢:)
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2022-07-06
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多