由于某种原因,我的代码似乎为我的一行输出生成了零,不确定问题是什么,但我认为这可能与整型和双精度值之间的差异以及它们何时转换有关。
在这种切换情况的底部,无论初始输入是什么,“标准化表示法”的值- 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;发布于 2017-02-08 08:44:59
reI, grI, blI是整数。当您使用它们执行操作时,它们将被视为整数,并且C++不会自动决定您要使用浮点数除法而不是整数除法。
强制自动转换的一种懒惰方法是在分子:reN2 = reI * 1.0 / (reI + grI + blI);中添加一个* 1.0。
或者使用从int到double的显式转换。
发布于 2017-02-08 08:45:42
整数除以自身加上其他一些整数(即i / (i + n)将始终为0(假设n为正))
你需要做一些转换,所以它不是整数除法,你会得到一个双倍的结果。
reN2 = (double)reI/(reI+grI+blI);
发布于 2017-02-08 10:34:47
您的问题出在这3行代码中:
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个。现在,在你的任何操作中,你都有一个值;,让我们以red为例,计算所有三个变量的和,其中包括分子中的一个。关于这个例子,我们有:
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中的值从浮点型转换为双精度型。
或者,您可以将得到的表达式乘以1.0。这一次,使用浮点值进行操作(乘法一),这导致结果表达式被保存为浮点值。在这里,我要感谢@Lagerbaer的想法。
第三种方法是在初始化reI、grI和blI时将它们的数据类型更改为double。我不确定你在作业中是否被允许这样做,所以我只是在这里提一下。
https://stackoverflow.com/questions/42102664
复制相似问题