我在jqGrid服务器端找到了PHP示例下一行
$start = $limit*$page - $limit; // do not put $limit*($page - 1)
之间有什么区别
$start = $limit*$page - $limit;
和
$start = $limit*($page - 1);
为什么作者不推荐第二种方式?
答案 0 :(得分:1)
在数学上,两个表达式都应该产生相同的结果 实际,因为CPU中的浮点算术(假设我们不考虑整数),这两个表达式的结果可能会有很大差异。
示例:强>
想象$page
是一个非常大的数字
在这种情况下,表达式1
中的$page - 1
将被计算出来(因为1比$page
小几个数量级),
表达式$start = $limit*($page - 1);
等同于$start = $limit*$page;
在第一种方式中,我们没有这样的问题,这就是为什么建议它。
<强>结论:强>
在数学上,它没有任何区别
实际上,CPU(浮点运算单元)只能处理有限的数量级,而且当与大数字组合时,较小的数字通常会被计算出来。
修改强>
一个例子值得1000字......
看看这个小提琴,看看两个数学相同的表达式如何产生不同的结果:
http://jsfiddle.net/EyalAr/Z9BT5/
答案 1 :(得分:1)
我怀疑这是一个数学数学问题。假设$page
很大,如6.02e231
。然后
($page - 1) = 6.02e231
(完全相同的浮点表示),以便
$limit*($page - 1) = $limit*$page
从任何处理器的角度来看。比较
$limit*$page = [SOME HUGE VALUE]
$limit*$page - $limit = [SUBTRACTION OF TWO HUGE VALUES]
将产生不同的结果,比“减1”表示法更准确。
因此,虽然在完美的数学世界中,这两个符号是相同的,但在非完美的计算世界中,第一个更容易发生“灾难性取消”(维基),而不是第二个。
答案 2 :(得分:0)
$start = $limit*$page - $limit;
这将首先执行乘法运算,然后减去结果的限制
$start = $limit*($page - 1);
这将首先减去$ page by 1然后使用$ limit
多次答案 3 :(得分:0)
就像在代数中一样,乘法在加法/减法之前按操作顺序发生。见PHP's precedence documentation。因此第一行执行$ limit * $ page,然后减去limit,这实际上与$page * ($limit-1)
相同。
我认为提示远离它的原因是,在代数中,语句在数学上是相同的,但在编程中它们不是(parens被视为操作顺序指示而不是数量表示)
答案 4 :(得分:0)
通常不建议使用第二种方法,因为在较旧的语言/编译器中,第二种语句会产生-0
。 -0
在计算中产生了一些其他问题,因此,第一种方法是首选方法。
您可以在此处看到上述内容:Code in PHP(No -0
observed)和Code in Lua(Observe -0
in output)
答案 5 :(得分:0)
老实说,我不明白为什么不推荐第二版。
$c = $a * $b - $a;
在抽象视图中,这将按如下方式计算:
$a
加载到CPU寄存器1中。$b
加载到CPU寄存器2中。$a
仍在寄存器中1.从寄存器2中减去它,将结果存储在任一寄存器中。$c
。如果编译器发现等式中的两个$a
操作数都相同,则整行只使用两个CPU寄存器。
$c = $a * ($b - 1);
$a
加载到寄存器1中。首先应该这样做,因为就我记忆而言,PHP保证了从左到右的评估顺序。$b
加载到寄存器2中。1
。$c
。这看起来非常像我一样的努力。然后,他们可能已经描述了整个事物并发现由于某种原因(例如由于线的上下文),第一个版本更有效。
假设整数算术,结果完全没有区别。我也不太共享浮点参数,因为如果$page
是如此之大的数字,那么使用哪个版本仍然无关紧要。要么从非常大的数字中减去1
,要么没有效果。或者,您将大数与1
分别乘以相同的因子,然后执行减法。这两个值在数量级上与原始值$page
和1
具有相同的差异。
答案 6 :(得分:-1)
程序员对准确性过于谨慎。
在数学上没有任何区别。
从程序员的角度来看,运算符优先级无关紧要,因为变量是基本数字。 (如果它们是foo classe与重载运算符的实例,那么故事就不同了)
$limit*$page - $limit
形式可能会失去准确性,请参阅rody_o对此的回答。但这不会发生,因为我从未认为$ page和$ limit的数量级为10 ^ 38或其他。但是php知道如何处理数字。请记住,我们甚至不知道它们是漂浮物!
正如其他人也提到了执行速度,这不是程序员可能想到的。你真的关心在你的代码中写哪个表单吗?选择一种形式而不是另一种形式甚至不是微观优化。
没有理由告诉别人他们绝对不应该使用第二种形式。没关系。