将函数舍入 1 - C

Round function off by 1 - C

char note_array[] = "G#5";

int approx_freq = 880;

int result = 0;
if(note_array[1] == '#')
    approx_freq = round(approx_freq * pow(2, 1.0/12));
switch(note_array[0])
{
case 'A': result =  approx_freq;
    break;
case 'B': result = round(approx_freq * pow(2, 2.0/12));
    break;
case 'C': result = round(approx_freq / pow(2, 9.0/12));
    break;
case 'D': result = round(approx_freq / pow(2, 7.0/12));
    break;
case 'E': result = round(approx_freq / pow(2, 5.0/12));
    break;
case 'F': result = round(approx_freq / pow(2, 4.0/12));
    break;
case 'G': result = round(approx_freq / pow(2.0, 2.0/12));
    break;
default: return 1;
    break;
}
return result;

即将输出 - 830

需要输出 - 831

我知道我对 round 函数的使用有问题,但我不知道我做错了什么。 有人可以帮我吗?

引入一个偏移量来选择向下舍入变成向上舍入的边界。在对 round() 的所有调用中这样做,例如

approx_freq = round(offset + approx_freq * pow(2, 1.0/12));

我不确定,但我想 offset 的值应该是您想要的 -0.5。
尝试并微调自己。

(请注意,正如其他 comments/answers 指出的那样,何时舍入是一个棘手的问题。我建议在仔细检查每种情况下是否需要舍入后使用偏移量。)

执行此步骤时您正在向下舍入:

approx_freq = round(approx_freq * pow(2, 1.0/12));

准确值为932.3275230361799。这会将 approx_freq 设置为 932。然后当你这样做时:

case 'G': result = round(approx_freq / pow(2.0, 2.0/12));
    break;

approx_freq / pow(2.0, 2.0/12))830.3176053067962,四舍五入为 830

您不应该在中间步骤中进行舍入。将approx_freq声明为floatdouble,只对最后的结果进行四舍五入。那么最后的计算结果将是 830.609,四舍五入为 831.