CS50 Filter灰度化非整数均值场景round函数异常排查求助
问题出在整数除法的截断行为!
我一眼就看出问题所在了——你代码里的除法操作是整数除法,会直接丢掉小数部分,导致round函数拿到的数值本身就不对。
举个例子,测试用的像素(27,28,28):
三个分量总和是
27 + 28 + 28 = 83
因为rgbtRed、rgbtGreen、rgbtBlue都是int类型,相加结果也是int,除以整数3时,C语言会执行整数除法,得到83 / 3 = 27(直接截断了0.666...的小数部分)
这个27被赋值给double类型的avgcolor后是27.0,round(27.0)自然还是27,和预期的28差了1。
修复方法:触发浮点数除法
你只需要让除法变成浮点数运算就行,有两种简单的改法:
方法1:把除数改成浮点数3.0
修改均值计算的代码:
avgcolor = (image[i][j].rgbtRed + image[i][j].rgbtBlue + image[i][j].rgbtGreen) / 3.0;
因为3.0是double类型,整数总和会被自动转换为double,除法结果就是精确的27.666...,round之后就会得到28。
方法2:强制转换其中一个分量为double
也可以先把任意一个颜色分量转成double,这样整个加法表达式都会变成浮点数运算:
avgcolor = ((double)image[i][j].rgbtRed + image[i][j].rgbtBlue + image[i][j].rgbtGreen) / 3;
验证效果
修改后再计算测试像素:
- 总和
83除以3.0得到27.666... round(27.666...)返回28,完全符合check50的预期结果。
改完代码重新跑检测,应该就能顺利通过所有测试啦!
内容的提问来源于stack exchange,提问作者Megapunk
相关产品推荐
相关产品推荐

