-1

サーバーからr、g、b値を取得していますが、すべて整数値であり、これらの整数値をこの方法でfloatに変換しています

int a;
float b=a;

次に、これらの float 値を 255.0f で除算し、その後 0.51690 と比較していますが、ここでは実際に比較結果が 1 ではなく 0 になっています。

ここで、r、g、b の値は int で、appdelegate.userRed、appdelegate.userGreen、appdelegate.userBlue は float です。

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 なしは、倍精度 double ではなく単精度 float であることを意味します。

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.0appdelegate.userRedます。数学的には、これは 128/255 です。ただし、コンピュータで浮動小数点演算を使用しているため、コンピュータは正確な数値ではなく、その浮動小数点システムで表現可能な値を返す必要があります。この場合、128/255.0は typedoubleを持ち、double128/255 に最も近い は 0.5019607843137254832299731788225471973419189453125 です。

次に、コードはその値を に割り当てますredredは であるためfloat、値は に変換されfloatます。ここでも、値を丸める必要があります。0.5019607843137254832299731788225471973419189453125 に最もfloat近い値は 0.501960813999176025390625 です。

次に、 と比較red0.501961ます。コンパイラは、ソース テキスト0.501961を として表現できる最も近い値double(0.5019609999999999052846533231786452233791351318359375) に変換します。

0.501960813999176025390625 は 0.50196099999999999052846533231786452233791351318359375 と等しくないため、比較は false を返します。

この比較を行う理由を説明していないため、代替案を提案することは困難です。floatピクセルの値が、整数 128 をfloat255 で割ってに変換した直接の結果であるかどうかを確認したいだけの場合は、 を使用することをお勧めしますred==128/255.f。(コード全体ではなく、名目上 を使用するように に変更appdeletegate.userRed/255.0することもできます。)appdelegate.userRed/255.ffloatdouble

ただし、浮動小数点演算に関連することを行う場合は、追加の考慮事項があります。特に、float値が 255 で除算することによるこの変換の直接の結果ではなく、追加の算術の結果である場合、その値には追加の丸め誤差が含まれる可能性が高く、それを直接比較して128/255.fも目的の結果が得られません。

于 2013-03-16T11:37:06.550 に答える