的可靠计算这似乎是没有道理的,但我无法得到这个解决:PHP立方根
我想计算基于给定的经验值(EXP)的水平。因此,我使用多维数据集根公式并向下舍入到下一个整数。当exp正好达到level^3
时,达到下一个级别。级别的数量是无限的,所以我会避免有一个预先计算的查找表。
当我使用标准PHP数学
floor(pow(10648, 1/3))
它返回21,而不是22。这是错误的,因为21^3给出92161.其原因是,由于有限的浮点精度POW(10648,1/3)不完全返回22,而是返回21.9993112732。 您可以通过以下代码片段查看:
$lvl = pow(10647, (float) 1/3);
print number_format($lvl, 10);
这是我的解决方法。但我不确定这是否是防弹的:
public static function getLevel($exp) {
$lvl = floor(pow($exp, (float) 1/3)); // calculate the level
if (pow($lvl + 1, 3) == $exp) { // make check
$lvl++; // correct
}
return $lvl;
}
此外,它涉及到检查时看起来有点脆弱。所以问题仍然存在: 有没有一种可靠,高效和防弹的计算立方根(正数)的方法。
谢谢。
为什么不使用'round()'而不是'floor()'? – Barmar 2014-10-30 07:52:16
'round()'在某些情况下也失败。以7为例。它应该返回级别1,但是'round(pow(7,(float)1/3))'返回2(错误) – stot 2014-10-30 07:57:51
真正的问题是'1/3'不能完全用浮点数表示。 – Barmar 2014-10-30 08:02:15