【问题标题】:Java: method for an equation relevant to the Karplus-Strong equation does not return the anticipated result; unclear causeJava:与 Karplus-Strong 方程相关的方程的方法不返回预期结果;原因不明
【发布时间】:2020-10-13 22:02:02
【问题描述】:

在提示的第 1 部分中,我希望将一个方程集成到 Java 中以获得一个句点 (T) 的值。等式如下:T = FS / (440 * (2 ^(h/12))

注意:

FS = 采样率,即 44100 / 1。

h = 半步,由用户提供。

这个等式的一个例子是:44100 / (440 * (2 ^(2/12)) = 89.3

我写的代码如下:

public static double getPeriod(int halfstep) {
    double T = 100; // TODO: Update this based on note
    
    double FS = 44100 / 1;
    double power = Math.pow(2, (halfstep / 12));
    double denominator = 440 * (power);
    double result = (FS) / (denominator);
    T = Math.round(result);
    
    return T;
}

// Equation test.
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.print("halfstep is: ");
    int halfstep = in.nextInt();
    
    double period = getPeriod(halfstep);
    System.out.print("Period: " + period + " ");
}

但是当我使用 h = 2, T = 100.0 而不是预期的 89.3 运行这段代码时,我不确定问题出在哪里。有什么想法吗?

【问题讨论】:

    标签: java equation guitar


    【解决方案1】:

    因为halfStepint,所以你写的时候

    (halfstep / 12)
    

    通过取halfStep / 12 并向下舍入到最接近的整数来完成计算。因此,如果您在此处插入 2,则halfStep / 12 将返回为 0 而不是 1/6。这会打乱计算,很可能是什么给了你错误的答案。

    对于如何在此处继续,您有几个选项。一种是将halfStep 更改为double 而不是int。另一个是将除法重写为

    halfStep / 12.0
    

    由于12.0double 字面量,它将按照您的意图执行除法。

    另一个潜在问题 - 您将变量 T 声明为 100.0,但从不在计算中的任何地方使用 T,并最终在返回之前覆盖它。我不确定这是否是故意的,或者这是否表明其中一个公式不正确。

    希望这会有所帮助!

    【讨论】:

    • 将 12 更改为 12.0 解决了该问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多