Java Math立方根精度损失
我对java比较陌生,所以对我放松点 我有函数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位可用于存储值。最重要的是,这
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
的输出时也缺乏准确性)