0

我在谷歌上搜索如何查找一个数字y是否是这个链接的力量x并遇到这个链接

爪哇

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.9999999Math.log()通过使用函数而不是 可以观察到这种效果Math.log10()

为了解决这个问题,我们需要将结果与 epsilon.

爪哇

return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;

那里我不明白return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;

那条线是什么意思?

为什么EPSILON在比较浮点数时使用?

4

2 回答 2

1

正如引用的部分所说,由于浮点不精确,您可以拥有两个应该完全相等的数字(如果创建它们的计算是以数学精确性进行的),但它们略有不同。

当您比较它们时,您希望考虑到微小的差异,并且如果它们仅相差很小的数量(称为 epsilon),则仍然将数字视为相等。

但是,如何选择合适的 epsilon 是一个棘手的问题,并且高度依赖于计算的性质。我想出于这个原因,Java 不包含“标准” epsilon 常量(其他一些语言包含)。

于 2017-09-11T00:04:43.233 回答
0

因为自然对数使用简单级数计算。https://en.wikipedia.org/wiki/Natural_logarithm 这样的系列可以在 CPU 的数学协处理器中实现。您可以使用简单的比例表示任何自然对数,而无需大量计算时间。

于 2017-11-14T22:23:53.507 回答