Java Math立方根精度损失

Java Math立方根精度损失,java,Java,我对java比较陌生,所以对我放松点 我有函数g(x)=8x^3 我必须在g之后输出g的倒数。因此: inverseGAG = ((Math.pow(functionG, 1.0/3))/8); 它给了我几乎正确的答案,比如说x=4 g(4)=512,所以512的倒数eg是512的立方根,即8,然后我们除以8=1 我的程序正在输出0.9999999999,我不知道为什么?您希望从不精确的数字表示中得到准确的答案。假设您使用的是double类型,那么在计算中只有64位可用于存储值。最重要的是,这

我对java比较陌生,所以对我放松点

我有函数
g(x)=8x^3

我必须在g之后输出g的倒数。因此:

inverseGAG = ((Math.pow(functionG, 1.0/3))/8);
它给了我几乎正确的答案,比如说
x=4

g(4)=512,所以512的倒数eg是512的立方根,即8,然后我们除以8=1


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

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

由于可用的精度有限,在进行浮点运算时,舍入误差必然会出现。如果您想了解更多有关浮点数学的细节,可以查看或


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

其他评论是正确的,在浮点运算中,你不能期望得到准确的结果,通常情况下,
BigDecimal
就是答案。然而,在
BigDecimal
中无法计算数字的任何非整数幂,因为结果至少可能是无理的。所以这不是一个很好的答案

我想强调路易斯·瓦瑟曼的评论,这可能是这里最实际的答案
Math.cbrt()
将在这里提供更好的精度,事实上,您的参数将获得
1.0
。我想它对立方根的情况使用了牛顿方法的特殊化,这将比一般的
pow()
方法(我希望使用对数)提供更好的精度


当然也可以参见
Math.sqrt()

使用
float
应该给出大约6-7个正确的位置和
double
15-16。你的成绩是10位,真是令人惊讶。哦,我实际上没有数这些位置,是的,是16位!您应该使用
Math.cbrt
,这可能会提高结果的准确性。(您当前的结果在表示1/3时缺乏准确性,在表示
Math.pow
的输出时也缺乏准确性)