输出始终为0

时间:2017-02-08 00:41:09

标签: c++

由于某种原因,我的代码似乎为我的一行输出产生零,不完全确定问题是什么,但我认为它可能与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;

3 个答案:

答案 0 :(得分:2)

reI, grI, blI是整数。当你用它们执行操作时,它们被视为整数,而C ++不会 自动决定你想要浮点除法而不是整数除法。

强制自动转换的一种懒惰方法是在分子中添加* 1.0reN2 = reI * 1.0 / (reI + grI + blI);

或使用intdouble的明确演员。

答案 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);

变量reN2grIblI的类型为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。这只是意味着我们告诉编译器将存储在reIgrIblI中的值转换为浮点数的double。

或者,您可以将结果表达式乘以1.0。这次,操作(乘法1)以浮点值发生,这导致结果表达式被保存为浮点值。我将在这里向@Lagerbaer表达他的想法。

第三种方法是在初始化时将reIgrIblI的数据类型更改为double。我不确定你是否被允许在你的任务中这样做,所以我只是在这里提到它。