Squaring Numbers in java using Math.pow getting error of precision
我有一个问题要写一种方法来输入LONG类型的数组,该数组存储从0到63(即20到263)的所有2的幂的值。
输出提示:使用Math.pow(x,y)将数字x放在指数y
上,到目前为止我遇到类似
之类的东西,但我一直遇到错误或Math.pow(大小,2);需要很长时间,发现两倍。我尝试过Math.pow(i,2);我收到相同的错误。/可能会丢失精度,任何帮助:)谢谢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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);
}
}
} |
- 请复制并粘贴确切的错误消息,以便我们为您提供帮助。
- 要进行平方运算,只需编写size * size即可。
- 嗯,我想我可能把那个代码弄错了,我有另一种尝试它的方法,因为如果您读了它的假设平方这个问题,但没有我把int array_size = 5;嗯,我只是新来的,我无法回答自己的问题,所以我无法发布尝试过的其他代码。/
- @ user3392994:您可以编辑它,而不必回答您的问题。除非您自己有一个答案,否则这是适当的。例如,您可以编辑问题以阐明是否要问关于2的幂的平方。
更好的shift
对于2x,其中x?∈??,最好将其写为位移
,而不是浮点指数
就精度和性能而言。实际上,1L << x是如此容易计算,以至于我宁愿写它而不是array[x],因此您可能会完全避免使用数组。
更多错误?
pow(x, 2)代码是x2,您可以更容易地将其计算为x*x。那么,是2还是平方的幂呢?
此外,您编写的pow(size,2)使用size并且不依赖于i。因此,数组的所有值都将相等。我想这不是您的意思。
错误出自
的地方错误消息的原因是Math.pow的结果是两倍,以及从double到long的隐式转换在Java中被禁止。您必须编写一个显式强制转换,即(long)pow(2, x)。但这确实趋于零,因此轻微的数字错误可能会导致错误的结果。您对Math.pow的唯一准确性保证是:
The computed result must be within 1 ulp of the exact result.
您可以在进行转换之前添加0.5,或使用Math.round代替强制类型转换,但是如您所见,要深入了解浮点数学的内部工作原理,以使这一方法正确。最好坚持整数数学,并完全避免使用double和Math.pow。
- 嗯,对不起,对于Java还是很陌生,刚上大学一年级..您能解释一下所有这些在我的代码中的位置吗,谢谢您的帮助。
- @ user3392994:不,对不起,我不会为您编写代码。尝试自己解决这个问题,可能要经过反复试验,再进行一些网络搜索,尽管这会花费更长的时间,但是您会在此过程中学到一些东西。关于Java的东西,但是关于如何查找信息的东西。
- 感谢有关错误的部分来自,帮助了我很多。我现在得到的更多,我认为我已将其固定为0至63的平方根,因为Math.pow是double值。并转换为长,谢谢
导致实际错误消息的原因是精度下降,这是因为您希望在pow的参数中将64bit的长整数填充为只能精确表示53bit整数的double。如果要为浮点数分配双精度值,则会收到相同的消息。
可以通过将int类型用作输入来避免这种情况。为了使平方适合一个64位有符号整数,该参数不能(远)长于有符号32位,并且对于2的幂,该指数必须小于63。
cosa < (1<<26),
1
| array [i ] = (long)Math. pow((double)cosa, 2); |
好的。首先Math.pow()返回一个double。您的数组类型为long。其次,您的战俘参数设置顺序错误,第一个参数是基数,第二个参数是指数。最后,您为指数使用了错误的变量(大小始终相同)。最后,请注意2 ^ 63太大,无法准确地用双精度表示。如要使用多头,应使用(逻辑)左移运算符,如其他人所述。
在这里,我为您修复了它:
- 谢谢帮了忙./只是这个问题我不应该拥有array_size = 5;它不应该由我来设定其平方。因为它要求使用您为我固定的代码来存储2的幂(从0到63)。/数组是双倍的,我需要很长的时间,以便它可以升到更高的平方。不只是24 ^ 2
- 将ARRAY_SIZE增加到63。
- 现在就做:)谢谢大家的帮助。看到我不知道math.pow是双精度值,您必须进行转换,找到了如何在所有人的帮助下完成的工作,谢谢
而不是long[] array = new long[ARRAY_SIZE];,请使用double[] array = new double[ARRAY_SIZE];,这样您的程序应如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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);
}
}
} |
EDIT:如果要使用long,则将其转换为array[i]=(long)Math.pow(size,2);,或者将其转换为很长一段时间通过临时存储它。数组。
- 您有理由以错误的顺序争执。而且,如果您会阅读其他答案,则会注意到,调用Math.pow以获得2的整数幂只是过分的了,就像使用核反应堆来炸鸡蛋一样。
- 你的意思是炒鸡蛋吗?你不是吗
错误的原因是Math.pow返回double,而您需要long。
但是数组的整个点尚不清楚。每当您编写:
时,您也可以编写:
并得到相同的结果。
此外,您甚至可以保存数组边界检查。