しかし、大学で 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;
}
このコードの最初のエラーは、仮数部が完全に間違っていることは明らかですが、これを修正する方法がわかりません。