2

我对java比较陌生,所以对我来说放轻松,

我有这个功能g(x) = 8x^3

我必须在 g 之后输出 g 的倒数。所以:

inverseGAG = ((Math.pow(functionG, 1.0/3))/8);

例如,它给了我几乎正确的答案,让我们说x = 4

g(4) = 512,所以 512 的逆 G 将是 512 的三次根,即 8,然后我们除以 8 = 1。

我的程序正在输出0.9999999999,我不知道为什么?

4

2 回答 2

1

您期望从不精确的数字表示中得到准确的答案。假设您使用的是该double类型,那么只有 64 位可用于在您的计算中存储值。最重要的是,这些值以二进制(以 2 为基数)而不是十进制(以 10 为基数)存储,并且可以在这两个基数中精确表示的分数是不同的。例如,0.1 10 = 0.00̅0̅1̅1̅ 2

由于可用的精度有限,在进行浮点运算时肯定会出现舍入误差。如果您想了解更多有关浮点数学的详细信息,可以查看Java 编程简介、9.1 浮点每个计算机科学家应该了解的浮点运算

在您的情况下,切换到 usingMath.cbrt可能会产生足够好的答案。更一般地说,进行四舍五入到小数点后 10 位可能也会给你一个足够好的答案——但你无法在所有情况下都得到正确的答案。

于 2013-11-02T16:57:41.933 回答
0

其他评论是正确的,您不能指望浮点算术的确切结果,这通常BigDecimal是答案。然而,没有办法计算一个数字的任何非整数幂,BigDecimal因为至少结果可能是不合理的。所以这不是一个完整的答案。

我想强调 Louis Wasserman 的评论,这可能是这里最实用的答案。Math.cbrt()在这里会给出更好的精度,事实上你会得到1.0你的论点。我想它在立方根的情况下使用了牛顿方法的专门化,这将比pow()我期望使用对数的一般方法提供更好的准确性。

当然也见Math.sqrt()

于 2013-11-02T17:12:32.543 回答