1

私はこのプログラムを書きました:

#include <stdio.h>
#include <stdint.h>
/*
 * See also : http://class.ece.iastate.edu/arun/CprE281_F05/ieee754/ie5.html
 */

union FloatingPointSinglePrecisionIEEE754 {
    struct {
        unsigned int mantissa : 23;
        unsigned int exponent : 8;
        unsigned int sign : 1;
    } raw;
    float f;
} fnumber;

union FloatingPointDoublePrecisionIEEE754 {
    struct {
        uint64_t mantissa : 52;
        unsigned int exponent : 11;
        unsigned int sign : 1;
    } raw;
    double d;
} dnumber;



int main() {

    printf("sign\texponent\tmantissa\n");

    fnumber.f = -6.8;
    printf("%x\t%x\t\t%x\n",
            fnumber.raw.sign,
            fnumber.raw.exponent,
            fnumber.raw.mantissa); 


    dnumber.d = -6.8;
    printf("%x\t%x\t\t%x\n",
            dnumber.raw.sign,
            dnumber.raw.exponent,
            dnumber.raw.mantissa); 


return 0;
}

単精度の場合、真の出力が得られましたが、倍精度の場合、プログラムは失敗します。Double-Precison のコンバーターを作成する方法を教えてください。

4

3 に答える 3

2

以下のプログラムは私にとってはうまくいくようです。私は得る:

sign    exponent    mantissa
1   81      59999a
1   401     b333333333333

私が行った 2 つの変更は、適切な C99 形式(これらの形式については、このウィキペディアのページを参照PRIx64てください) を使用することと、構造体のビット フィールドに同じ基本型を使用することです。ビットフィールドは十分に指定されていないことで悪名高いですが、異なる基本型を使用すると、コンパイラがここで必要としない新しい単語を開始する可能性があります。printf()union FloatingPointDoublePrecisionIEEE754

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
/*
 * See also : http://class.ece.iastate.edu/arun/CprE281_F05/ieee754/ie5.html
 */

union FloatingPointSinglePrecisionIEEE754 {
    struct {
        unsigned int mantissa : 23;
        unsigned int exponent : 8;
        unsigned int sign : 1;
    } raw;
    float f;
} fnumber;

union FloatingPointDoublePrecisionIEEE754 {
    struct {
        uint64_t mantissa : 52;
        uint64_t exponent : 11;
        uint64_t sign : 1;
    } raw;
    double d;
} dnumber;



int main() {

    printf("sign\texponent\tmantissa\n");

    fnumber.f = -6.8;
    printf("%x\t%x\t\t%x\n",
            fnumber.raw.sign,
            fnumber.raw.exponent,
            fnumber.raw.mantissa); 


    dnumber.d = -6.8;
    printf("%x\t%x\t\t%" PRIx64 "\n",
            dnumber.raw.sign,
            dnumber.raw.exponent,
       (uint64_t)dnumber.raw.mantissa); 


return 0;
}
于 2013-05-29T09:40:22.287 に答える
1

単純なフォーマッタprintfで 64 ビットの unsigned int を出力しようとして失敗したのは、あなたのものである可能性があります。「長い」符号なし整数に a を%x使用します。%xl

dnumber.d = -6.8;
printf("%x\t%x\t\t%xl\n",  // note the %xl format specifier for the mantissa
        dnumber.raw.sign,
        dnumber.raw.exponent,
        dnumber.raw.mantissa); 

printf リファレンスを参照してください

于 2013-05-29T08:30:20.767 に答える