好的,我的任务是生成一个具有自定义频率的正弦波数组值。 这是我的正弦函数:
Math.sin(frequency*(j/samplesPerSecond)*Math.PI*2)
j
是数组索引,samplesPerSecond
等于44100。
现在,对于一个100,000个值的数组,它返回0.0为前33,000,1.571509 ... E-14为下一个33,000和3.143018 ... E-14为其余。
我已经尝试了System.out.println(Math.sin(Math.PI));
并且它没有返回0但它返回1.224646 ... E-16
这是我的第一个java任务,所以我可能会忽略一些非常明显的东西,但我真的很困惑。
答案 0 :(得分:4)
尝试更改为:
Math.sin(1.0 * frequency*(1.0 * j / samplesPerSecond) * Math.PI * 2)
看看它是否更好。
我怀疑你有整数除法的问题。
在Java 2/5 = 0中,你知道,而1.0 * 2/5
通常是你期望的(0.4)。
答案 1 :(得分:2)
很可能你正在处理整数除法。因此,如果分子小于分母,它将舍入为零。尝试将j或samplesPerSecond转换/转换为float或double。
答案 2 :(得分:1)
j
是数组索引,samplesPerSecond
等于44100。
作为数组索引,我假设j
的类型为int
。这是您的主要问题,因为您正在执行整数除法,它会将结果截断为整数。将j
投射到double
,或者在划分之前将其乘以一倍:
((double)j / samplesPerSecond)
(1.0 * j / samplesPerSecond)
答案 3 :(得分:0)
我已经尝试过System.out.println(Math.sin(Math.PI));并且不返回0,但返回1.224646 ... E-16
已经指出,这与double的有限精度有关。 在这种情况下,我会使用类似的东西:
double result = Math.sin(2*Math.PI);
for(double d=-1;d<=1;d=d+0.05){
if(Math.abs(i-result) <1E-10){
result = d;
}
}
System.out.println(result); //prints 0