在java的平方数使用的精密Math.pow得到错误(Squaring Numbers in jav

2019-10-19 12:47发布

我已经做的一个问题写入输入的方法类型LONG的阵列,从0到63(即2 0至2 63)中存储的2全部权力的值

输出阵列屏幕的contects。 提示:Math.pow(X,Y)是UED把数X的指数y

到目前为止,我喜欢的东西

我不断收到错误或Math.pow(大小,2); 需要多久,发现双。 我试图Math.pow(I,2); 我得到的精度相同error./可能损失,,任何帮助:)谢谢

class ws3q2
{
    public static void main(String[]args)
    {

        int ARRAY_SIZE = 5;

        long size = ARRAY_SIZE;

        long[] array = new long[ARRAY_SIZE];

        for(int i = 0; i < ARRAY_SIZE; ++i)
        {
        array[i] = Math.pow(size,2);
        }

    }
}

Answer 1:

更好的移

对于2 其中你最好写这为移位

1L << x

而不是一个浮点幂

pow(2, x)

无论在精度方面和性能方面。 事实上, 1L << x是很容易计算,我宁愿写的是不是array[x]所以你可能也许完全避免的阵列。

更多的错误?

pow(x, 2)当你在你的代码写的是你可以计算更容易为x*x 。 那么,哪一个是它是两个或正方形的权力?

此外,你写pow(size,2)它使用size ,不取决于i 。 所以你的数组中的所有值将是相等的。 我想这是不是你的意思。

当你的错误来自

该错误消息的原因是,结果Math.pow是翻番,从隐式转换doublelong在Java中是被禁止的。 你必须写一个明确的转换,即(long)pow(2, x) 但是,这确实向零舍入,所以轻微的数字错误可能会导致错误的结果。 你有唯一的精确性保证Math.pow是这样的:

计算的结果必须是1个ULP准确结果的范围内。

您可以添加0.5做转换之前,或使用Math.round而不是演员,但你看,你要知道很多有关浮点运算得到这个正确的内部工作。 更好地坚持整数运算和避免doubleMath.pow干脆。



Answer 2:

错误的原因是Math.pow返回double ,在那里你想有一个long

但是,你的阵列的全部意义不明确。 每当你写的:

array[i]

你可以也写:

1L << i

并得到同样的结果。

另外,你甚至可以保存数组边界检查。



Answer 3:

代替long[] array = new long[ARRAY_SIZE]; 中,使用double[] array = new double[ARRAY_SIZE]; 让你的程序是这样的:

class ws3q2
{
    public static void main(String[]args)
    {
        int ARRAY_SIZE = 5;
        long size = ARRAY_SIZE;
        double[] array = new double[ARRAY_SIZE];
        for(int i = 0; i < ARRAY_SIZE; ++i)
        {
            array[i] = Math.pow(size,2);
        }
    }
}

编辑:如果要long ,然后将其转换, array[i]=(long)Math.pow(size,2); 或隐蔽它不久将它存储在一个临时。 阵列。



Answer 4:

好。 所有Math.pow的第一个()返回一个double。 你的阵列的类型为long。 其次,你有错误的顺序你的战俘的参数,第一个参数是基础,第二个指数。 最后,您使用了错误的变量为您指数(大小始终是一样的)。 最后注意,2 ^ 63过大,无法通过双来准确地表示。 如果你想使用多头,你应该使用(逻辑)左移运算代替,如其他人所说。

在这里,我固定它给你:

class ws3q2
{
    public static void main(String[]args)
    {
        int ARRAY_SIZE = 5;
        long size = ARRAY_SIZE;
        double[] array = new double[ARRAY_SIZE];
        for(int i = 0; i < ARRAY_SIZE; ++i)
        {
            array[i] = Math.pow(2, i);
        }
    }
}


Answer 5:

对于实际的错误信息,精度损失 ,原因是你想要的,在战俘的说法,塞住64位的长整型成两倍只能代表53bit的整数准确。 如果你想分配一个双重价值为float你得到了同样的信息。

这可以通过使用int类型的输入来避免。 为方形装配到一个64位有符号整数,该参数不能为(多)长于32位签名,以及用于2的幂,指数必须小于63小。

或用途, cosa < (1<<26)

array[i] = (long)Math.pow((double)cosa,2);


文章来源: Squaring Numbers in java using Math.pow getting error of precision