我正在使用Google搜索如何查找某个y
号码是x
的强大功能并遇到此link
爪哇
public class Solution { public boolean isPowerOfThree(int n) { return (Math.log10(n) / Math.log10(3)) % 1 == 0; } }
常见陷阱
这个解决方案存在问题,因为我们开始使用双打 意味着我们受精确错误的影响。这意味着,我们永远不应该 比较双打时使用
==
。那是因为结果Math.log10(n) / Math.log10(3)
可以是5.0000001
或4.9999999
。这个 使用函数Math.log()
而不是函数可以观察到效果Math.log10()
。为了解决这个问题,我们需要将结果与a进行比较
epsilon
。爪哇
return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;
我不理解return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;
该行的含义是什么?
为什么在比较浮点时使用 EPSILON
?
答案 0 :(得分:1)
正如引用的部分所说,由于浮点不精确,你可以有两个数字应该完全相等(如果创建它们的计算是用数学精确性进行的),但是它们稍有不同。
当你比较它们时,你想要考虑那个微小的差异,并且如果它们之间只有少量差异,称为epsilon仍然可以将数字视为相等。
如何选择合适的epsilon是一个棘手的问题,并且高度依赖于计算的性质。我想由于这个原因,Java不包含“标准”epsilon常量(其他一些语言)。
答案 1 :(得分:0)
因为自然对数使用简单序列计算。 https://en.wikipedia.org/wiki/Natural_logarithm 这样的系列可以在CPU中的数学协处理器中实现。您可以使用简单的比例从自然表达任何对数,而无需大的计算时间。