0

しかし、大学で C++ の講義が始まったにもかかわらず、最初の問題が発生しました。私たちの仕事は、IEEE 754 標準を介して C++ で浮動小数点用の自作の構造体を実装することでした。

float を格納し、生のバイト表現と内部表現を s、e、m として読み取ることができるデータ構造を作成します。ユニオンとビットフィールド構造体を組み合わせて使用​​します。float 番号が構造体の float 部分に割り当てられ、raw および s/e/m 表現が出力されるプログラムを作成します。raw と m には 16 進出力を使用します。

私がこれまでに持っていたものは次のとおりです。

#include <stdio.h>
#include <math.h>

union {
    struct KFloat {
        //Using bit fields for our self made float. s sign, e exponent, m mantissa
        //It should be unsigned because we simply use 0 and 1
        unsigned int s : 1, e : 8, m : 23;
    };
    //One bit will be wasted for our '.'
    char internal[33];
};

float calculateRealFloat(KFloat kfloat) {
    if(kfloat.s == 0) {
        return (1.0+kfloat.m)*pow(2.0, (kfloat.e-127.0));
    } else if (kfloat.s == 1) {
        return (-1.0)*((1.0+kfloat.m)*pow(2.0, (kfloat.e-127.0)));
    }
    //Error case when s is bigger 1
    return 0.0;
}

int main(void) {
    KFloat kf_pos = {0, 128, 1.5707963705062866};//This should be Pi (rounded) aka 3.1415927
    KFloat kf_neg = {1, 128, 1.5707963705062866};//Pi negative

    float f_pos = calculateRealFloat(kf_pos);
    float f_neg = calculateRealFloat(kf_neg);

    printf("The positive float is %f or ",f_pos);
    printf("%e\n", f_pos);

    printf("The negative float is %f or ",f_neg);
    printf("%e", f_neg);
    return 0;
}

このコードの最初のエラーは、仮数部が完全に間違っていることは明らかですが、これを修正する方法がわかりません。

4

2 に答える 2

1

Bruce Dawson は、浮動小数点表現と演算に関する優れた一連のブログ投稿を行っています。シリーズの最新版には、この主題について詳しく説明している以前の投稿へのリンクがたくさんあります

于 2013-05-02T16:32:09.163 に答える