0

次のコードを検討してください。

#include<stdio.h>
#define k 0.7
#define p 0.5
int main()
{
    float a=k,b=p;
    double aa=k;
    if(a<k)
    {
         if(b<p) printf("2 is right");    
         else      printf("1 is right");
    }
    else printf("0 is right");
    printf("\n");
    if(a>k)
    {
         if(b<p) printf("2 is right");    
         else      printf("1 is right");
    }
    else printf("0 is right");
    return 0;
}

これをこの質問のパートIIと見なしてください。ここでの理解は、浮動小数点定数の倍精度値(数値定数として表される場合は2倍)が、対応する浮動小数点値に変換されたときに失われるということでした。例外的な値はX.5とX.0でした。しかし、私は次の結果を観察しました:

Input           Output
K=0.1 to 0.4        0 is right
                    1 is right

K=0.5               0 is right
                    1 is right

K=0.6               0 is right
                    1 is right

K=0.7               1 is right
                    0 is right

K=0.8               0 is right
                    1 is right

K=0.9               1 is right
                    0 is right

K=8.4               1 is right
                    0 is right

なぜこの奇妙な振る舞いなのですか?このプロパティを表示している浮動小数点値が少ないのはなぜですか?float精度の値が常に精度の値よりも小さいと仮定することはできませんdoubleか?この動作をどのように説明しますか?

4

1 に答える 1

2

float精度の値が常に精度の値よりも小さいと仮定することはできませんdoubleか?

実際には、どちらも同じ精度である可能性があります。doubleの範囲と精度は。の範囲と精度以上であると想定できますfloat

doubleしかし、すべての実用的な目的のために、それは53ビットの精度とfloat24を持っている有益な賭けです。そしてそれdoubleは11ビットの指数、float8ビットを持っています。

したがって、エキゾチックなアーキテクチャを無視floatすると、精度が低く、範囲がdouble、よりも小さくなります。すべてのfloat値はとして表現できますがdouble、その逆はできません。したがって、floattoからのキャストdoubleは値を保持しますが、doubletoからのキャストはfloat、24ビットを超える精度を必要とするすべての値を変更します。

キャストは通常​​、次の方法で値の仮数を24ビットの精度にfloat丸めることによって(範囲内の値に対して)実行されます。double

  • 仮数の25番目の最上位ビットが0の場合、仮数は切り捨てられます(値はゼロに向かって丸められます)
  • 25番目の最上位ビットが1で、下位のすべてのビットが0であるとは限らない場合、値はゼロから四捨五入されます(仮数が切り捨てられ、最下位ビットの値が追加されます)。
  • それ以外の場合、仮数は丸められるため、24番目の最上位ビットはゼロになります。これは、半分の場合はゼロから、半分の場合はゼロに向かって丸められます。

値が変更されないことがわかるいくつかの場合を除いて、小数展開を見ても、 adoubleをキャストして値が増加するか減少するかを予測することはできません。float重要なのはバイナリ拡張です。

于 2012-07-18T12:43:12.553 に答える