Java Math.sin()没有按预期工作

时间:2013-12-20 16:04:31

标签: java arrays math audio sine

好的,我的任务是生成一个具有自定义频率的正弦波数组值。 这是我的正弦函数:

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任务,所以我可能会忽略一些非常明显的东西,但我真的很困惑。

4 个答案:

答案 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