我已经做的一个问题写入输入的方法类型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);
}
}
}
更好的移
对于2 其中你最好写这为移位
1L << x
而不是一个浮点幂
pow(2, x)
无论在精度方面和性能方面。 事实上, 1L << x
是很容易计算,我宁愿写的是不是array[x]
所以你可能也许完全避免的阵列。
更多的错误?
pow(x, 2)
当你在你的代码写的是你可以计算更容易为x*x
。 那么,哪一个是它是两个或正方形的权力?
此外,你写pow(size,2)
它使用size
,不取决于i
。 所以你的数组中的所有值将是相等的。 我想这是不是你的意思。
当你的错误来自
该错误消息的原因是,结果Math.pow
是翻番,从隐式转换double
到long
在Java中是被禁止的。 你必须写一个明确的转换,即(long)pow(2, x)
但是,这确实向零舍入,所以轻微的数字错误可能会导致错误的结果。 你有唯一的精确性保证Math.pow
是这样的:
计算的结果必须是1个ULP准确结果的范围内。
您可以添加0.5
做转换之前,或使用Math.round
而不是演员,但你看,你要知道很多有关浮点运算得到这个正确的内部工作。 更好地坚持整数运算和避免double
和Math.pow
干脆。
错误的原因是Math.pow
返回double
,在那里你想有一个long
。
但是,你的阵列的全部意义不明确。 每当你写的:
array[i]
你可以也写:
1L << i
并得到同样的结果。
另外,你甚至可以保存数组边界检查。
代替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);
或隐蔽它不久将它存储在一个临时。 阵列。
好。 所有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);
}
}
}
对于实际的错误信息,精度损失 ,原因是你想要的,在战俘的说法,塞住64位的长整型成两倍只能代表53bit的整数准确。 如果你想分配一个双重价值为float你得到了同样的信息。
这可以通过使用int类型的输入来避免。 为方形装配到一个64位有符号整数,该参数不能为(多)长于32位签名,以及用于2的幂,指数必须小于63小。
或用途, cosa < (1<<26)
array[i] = (long)Math.pow((double)cosa,2);