2016-10-25 2 views
0

の指数IがHow to get the sign, mantissa and exponent of a floating point numberサインオン、仮数、およびダブル

#include <stdio.h> 
typedef union { 
    float f; 
    struct { 
    unsigned int mantisa : 23; 
    unsigned int exponent : 8; 
    unsigned int sign : 1; 
    } parts; 
} double_cast; 

int main() { 
    double_cast d1; 
    d1.f = 0.15625; 
    printf("sign = %x\n",d1.parts.sign); 
    printf("exponent = %x\n",d1.parts.exponent); 
    printf("mantisa = %x\n",d1.parts.mantisa); 
    return 0; 
} 

から次のコードを見つけしかし、どのように、私は11であること、仮数値が52であることと、二重指数として、それをキャストしないと、1であることに署名?

答えて

1

だけのロジックを拡張して、このようなあなたの労働組合を定義し、移植性のための標準INT 64を使用して:

ところで
#include <stdint.h> 

typedef union { 
    double f; 
    struct { 
    uint64_t mantisa : 52; 
    uint64_t exponent : 11; 
    uint64_t sign : 1; 
    } parts; 
} double_cast; 

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

:フロートマッピングは、同様の標準タイプを使用しての代わりに、intする必要があります:

typedef union { 
    float f; 
    struct { 
    uint32_t mantisa : 23; 
    uint32_t exponent : 8; 
    uint32_t sign : 1; 
    } parts; 
} float_cast; 
+0

ありがとうございます、長年の宣言は何ですか? 8文字の値はどうですか? – OregonState2016

+1

'long'は8バイトか4バイトか何でもかまいません。そのため、' 'はそこにあります:定義されたサイズの統一型を提供するためです。 –

+1

C標準はビットフィールドの配置方法を制限しないので、それはあまり移植性がありません。 – 2501

-1

私はあなただけビットを使用し、ダブル/フロートからフィールドを抽出するための演算子をシフトすべきだと思います。あなたはそのためにマクロ/機能を作ることができます。

+0

ビット演算子は整数型にのみ適用でき、 'float'、' double '、または他の実数型を返します。 –

+0

はい、ただし、ポインタを使用することはできます。 – Kajtek

+0

ポインタを使用してあるタイプのオブジェクトにアクセスすると、別のタイプのオブジェクトであるかのように、未定義の動作が呼び出されます。例外はいくつかありますが、ここで適用できるのは 'char *'または 'unsigned char * 'を使って実際の値にアクセスすることだけです。それはうまくいくかもしれませんが、単純にshift/mask/doneするよりも複雑になります。 –

関連する問題