将函数舍入 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
声明为float
或double
,只对最后的结果进行四舍五入。那么最后的计算结果将是 830.609
,四舍五入为 831
.
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
声明为float
或double
,只对最后的结果进行四舍五入。那么最后的计算结果将是 830.609
,四舍五入为 831
.