需要格式化,编辑需要一些时间。
答案 0 :(得分:1)
将unsigned int l
与投放到int
的表达式进行比较会导致问题,这会产生未定义的结果。在第二种情况下,内部表达式全部评估为unsigned int
并在评估后转换为int
(精度损失可能会降低正值)。在第一种情况下,除法适用之前,除法函数的提名者将被转换为int
。
你应该更好地写下这样的条件,或者甚至更好地省略演员表(你的表达式中没有单float
或double
数学运算,你'仅处理unsigned int
):
while(l>(unsigned int)(i*(i+1)*(2*i+1))/3) { // ...
// ^^^^^^^^
如果您这样做,您将始终经历无休止或非常长时间的循环。恕我直言,检查条件表达式的结果是否可能大于std::numeric_limits<unsigned int>::max()
,不能更大是没有意义的。
答案 1 :(得分:1)
此代码不会为您提供正确答案。计算可以改写为(i *(i + 1)*(2 * i + 1))&lt; 3 * 4,294,967,295,现在考虑左手边计算的含义。
答案 2 :(得分:1)
while循环中出现的不等式为3阶。这种类型的曲线具有非常高的斜率,这意味着坐标的微小变化会在y中产生巨大的数量。 while循环很快遇到了unsigned int和i的溢出,因此给出了永无止境的循环(是的,永远不会结束,我试过)。
解决方案很简单。以对数打破不平等。现在三阶多项式是log的线性。最终它奏效了。