奇怪的计算错误


Strange calculation error

<?php
function neglogic($x,$y)
{
    if ($x<0.0 &&  $y>=0.0 )
    {
        $p1=("1");
    }
    elseif ($x<<0.0 &&  $y<<0.0 )
    {
        $p1=($x/$y);
    }
    if ($x==0.0 &&  $y>=0.0 )
    {
        $p1=("1");
    }
    elseif ($x==0.0 &&  $y<0.0 )
    {
        $p1=("0.05");
    }
    if ($x>0.0 && $y <=0.0)    
    { 
        $p1=("0.20");
    }
    elseif($x>0.0 && $y >0.0)
    {
        $q1=($x-$y);
        if ($q1>=0)
        {
            $p1=("0.20");
        }
        if ($q1<0)
        {
            $p1=("1.0");
        }
    }
    return $p1;
}
?>

这是脚本,它工作得很好,但我注意到它在(-1到-0.001)之间的值失败。

请尝试下面的操作,第二次(-.8,-2)失败,提示$pq未定义。

我知道我可以在开头定义$p1,但是我想知道为什么对于第二个数字它失败了。

<?php
echo neglogic(-8,-2);
?>
<?php
echo neglogic(-0.8,-2);
?>

In elseif ($x<<0.0 && $y<<0.0 )

"<<"在PHP中并不表示小于。意思是向左平移。

你是说左移0位吗?或者你的意思是测试低于<

http://www.php.net/manual/en/language.operators.bitwise.php

如果"<<"在代码中,则该代码是有效的,会导致意外行为。也就是一个bug。由于左移0位没有任何作用,if变成if ($x &&)$y),如果x和y在转换为布尔值时都为真,则为真。根据PHP文档,0和各种类似的值为假,其他都为真。因此,只要x和y存在且非零或均为"真",错误后面的子句就会执行。特别是,if子句可以在x或y为正数时执行,因为正值为真,如果您认为测试的值小于0,则这是无意的行为。

http://www.php.net/manual/en/language.types.boolean.php language.types.boolean.casting

http://www.php.net/manual/en/language.types.boolean.php language.types.boolean.casting

这段代码中有许多非常奇怪的样式,但最引人注目的是:

 elseif ($x<<0.0 &&  $y<<0.0 )

你真的是指<< -这是位左移操作符,因为它被传递0作为移位,所以它将什么也没有。

你的意思是<,小于比较?