由于某种原因,我的代码似乎为我的一行输出产生零,不完全确定问题是什么,但我认为它可能与int和double值之间的差异以及它们被转换时有关。
在此开关情况的底部,“标准化表示”的值 - reN2,grN2,blN2将产生0,无论初始输入是什么。我不确定我做错了什么。
如果变量名称有任何混淆,请告诉我。这是一个家庭作业,不会被一个人评分,所以我不认为让变量更加不同,因为只有我会看到它们。
case'd':
double red2, green2, blue2;
cout << "Input r, g, b: ";
cin >> red2 >> green2 >> blue2;
int reI, grI, blI;
reI = red2*255;
grI = green2*255;
blI = blue2*255;
cout << "Integer representation: " << reI << ", " << grI << ", "
<< blI;
cout << endl;
if(reI > grI && reI > blI && green2 != blue2)
cout << "Reddish pixel";
else if(grI > reI && grI > blI && red2 != blue2)
cout << "Greenish pixel";
else if(blI > reI && blI > grI && green2 != red2)
cout << "Blueish pixel";
else if(blue2 == 0.0 && red2 == 0.0 && green2 == 0.0)
cout << "Black pixel";
cout << endl;
if((reI+grI+blI) != 0)
{
double reN2, grN2, blN2;
reN2 = reI/(reI+grI+blI);
grN2 = grI/(reI+grI+blI);
blN2 = blI/(reI+grI+blI);
cout << "Normalized representation: " << reN2 << ", " << grN2
<< ", " << blN2;
}
break;
答案 0 :(得分:2)
reI, grI, blI
是整数。当你用它们执行操作时,它们被视为整数,而C ++不会 自动决定你想要浮点除法而不是整数除法。
强制自动转换的一种懒惰方法是在分子中添加* 1.0
:reN2 = reI * 1.0 / (reI + grI + blI);
。
或使用int
到double
的明确演员。
答案 1 :(得分:2)
一个整数除以它自己加上一些其他整数(即i / (i + n)
总是为0(假设n为正)
你需要做一些投射,所以它不是整数除法,你得到双重结果。
reN2 = (double)reI/(reI+grI+blI);
答案 2 :(得分:0)
你的问题在于以下三行:
reN2 = reI/(reI+grI+blI);
grN2 = grI/(reI+grI+blI);
blN2 = blI/(reI+grI+blI);
变量reN2
,grI
和blI
的类型为int。结果,虽然这3个操作的结果存储为浮点值,但没有用另一个浮点值进一步处理这些浮点数(即将它们乘以浮点值,如2.5等)。因此,您的案例中的最终输出没有小数点。现在,我将解释为什么输出始终为零。 (我假设这3个值不能为负数,因为它们固定在0到255之间)。
假设您在reI中有25个,在blI中有23个,在grI中有12个。现在,在您的任何操作中,您都拥有其中一个值;让我们以红色为例,在所有三个变量的总和上,包括分子中的变量。所以关于这个例子,我们有:
25 / (25 + 23 + 12)
大多数情况与此类似;分子小于分母。因此,您的结果始终小于1且大于0,使其值为0.xx。现在,因为你的操作只是在整数上,所以没有附加十进制值,这导致0.xx被舍入到0.这就是为什么你总是得到一个0。
解决这个问题的最简单方法是使用显式强制转换。将这些行更改为:
reN2 = (double)reI/(reI+grI+blI);
grN2 = (double)grI/(reI+grI+blI);
blN2 = (double)blI/(reI+grI+blI);
应该排序问题。在这里,我们将变量转换为double。这只是意味着我们告诉编译器将存储在reI
或grI
或blI
中的值转换为浮点数的double。
或者,您可以将结果表达式乘以1.0
。这次,操作(乘法1)以浮点值发生,这导致结果表达式被保存为浮点值。我将在这里向@Lagerbaer表达他的想法。
第三种方法是在初始化时将reI
,grI
和blI
的数据类型更改为double
。我不确定你是否被允许在你的任务中这样做,所以我只是在这里提到它。