-1

我从服务器获取的 r,g,b 值都是整数值,我正在将这些整数值转换为以这种方式浮动

int a;
float b=a;

然后我将这些浮点值除以 255.0f,然后与 0.51690 进行比较,但实际上我得到的比较结果是 0 而不是 1。

这里 r,g,b 值是 int 并且 appdelegate.userRed,appdelegate.userGreen, appdelegate.userBlue 是浮点数。

appdelegate.userRed=r;
appdelegate.userGreen=g;
appdelegate.userBlue=b;
NSLog(@"r is %d",r);

结果:2013-03-16 10:56:33.488 * [2407:14003] r 为 128

float red=appdelegate.userRed/255.0;
float green=appdelegate.userGreen/255.0;
float blue=appdelegate.userBlue/255.0;
NSLog(@"red is %f",red);

2013-03-16 10:56:35.642 * [2407:14003] 红色为 0.501961

    NSLog(@"comparision is %d",(red==0.501961));

2013-03-16 10:57:33.743 ** [2407:14003] 比较为 0

4

2 回答 2

1

对于浮点比较,我们必须在值的末尾使用 f 或 F 。如下所示

NSLog(@"comparision is %d",(red==0.501961F));

没有 f 意味着它是单精度浮点数而不是双精度双精度数。

来自 C99 标准:

An unsuffixed floating constant has type double. If suffixed by the letter f or F, it has type float.

对于浮点比较,

int compare_float(float f1, float f2)
{
    float precision = 0.00001;
    if (((f1 - precision) < f2) && 
        ((f1 + precision) > f2))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
于 2013-03-16T05:35:34.560 回答
1

您的代码首先计算128 的appdelegate.userRed/255.0位置appdelegate.userRed。数学上,这是 128/255。但是,由于您在计算机中使用浮点运算,因此计算机必须返回一个可以在该浮点系统中表示的值,而不是精确的数学值。在这种情况下,128/255.0有 type doubledouble最接近 128/255 的是 0.5019607843137254832299731788225471973419189453125。

然后您的代码将该值分配给red. 因为red是 a float,所以值被转换为float。同样,该值必须四舍五入。最接近 0.5019607843137254832299731788225471973419189453125的float值为 0.501960813999176025390625。

然后你red比较0.501961。编译器将源文本转换为0.501961可表示为 a 的最接近的值double,即 0.50196099999999999052846533231786452233791351318359375。

由于 0.501960813999176025390625 不等于 0.50196099999999999052846533231786452233791351318359375,因此比较返回 false。

很难为您推荐替代方案,因为您没有解释为什么要进行这种比较。如果您只想检查float一个像素的值是否是整数 128float除以 255 的直接结果,那么我建议您使用red==128/255.f. (您可能还希望更改appdeletegate.userRed/255.0为,appdelegate.userRed/255.f以便名义上使用float,而不是double在整个代码中。)

但是,如果您正在做更多涉及浮点运算的事情,则还有其他注意事项。特别是,如果一个float值不是除以 255 的直接结果,而是额外算术的结果,那么该值很可能包含额外的舍入误差,直接比较它128/255.f不会产生所需的结果。

于 2013-03-16T11:37:06.550 回答