我对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
,我不知道为什么?
我对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
,我不知道为什么?
您期望从不精确的数字表示中得到准确的答案。假设您使用的是该double
类型,那么只有 64 位可用于在您的计算中存储值。最重要的是,这些值以二进制(以 2 为基数)而不是十进制(以 10 为基数)存储,并且可以在这两个基数中精确表示的分数是不同的。例如,0.1 10 = 0.00̅0̅1̅1̅ 2。
由于可用的精度有限,在进行浮点运算时肯定会出现舍入误差。如果您想了解更多有关浮点数学的详细信息,可以查看Java 编程简介、9.1 浮点或每个计算机科学家应该了解的浮点运算。
在您的情况下,切换到 usingMath.cbrt
可能会产生足够好的答案。更一般地说,进行四舍五入到小数点后 10 位可能也会给你一个足够好的答案——但你无法在所有情况下都得到正确的答案。
其他评论是正确的,您不能指望浮点算术的确切结果,这通常BigDecimal
是答案。然而,没有办法计算一个数字的任何非整数幂,BigDecimal
因为至少结果可能是不合理的。所以这不是一个完整的答案。
我想强调 Louis Wasserman 的评论,这可能是这里最实用的答案。Math.cbrt()
在这里会给出更好的精度,事实上你会得到1.0
你的论点。我想它在立方根的情况下使用了牛顿方法的专门化,这将比pow()
我期望使用对数的一般方法提供更好的准确性。
当然也见Math.sqrt()
。