【C言語シミュレーション実装】浮動小数点数-回転-定点数
3212 ワード
超神になるには、何でも精進しなければならない.
浮動小数点数ポインタ-を-整数ポインタに変換し、ポインタの内容を16進数で出力します.
サンプル・プログラム:
テスト:
入力(float)
出力(16進)
バイナリ
8.25
41040000
0100 0001 0000 0100 0000 0000 0000 0000
-8.25
c1040000
1100 0001 0000 0100 0000 0000 0000 0000
シンボルビット:0は正、1は負;
指数位:シフト符号表示;
端数ビット:小数点以下のビットのみを暗黙的に格納する
例:
10進数:8.25
バイナリ:1000.01=1.00001 x 23=1.00001 x 2011
シンボルビット:0
指数位は:3+127=130=1000 0010 b
末尾番号:00001
最終的には、8.25コンピュータに記憶される形態は、0100 0001 0000 0100 0000 0000 0000 0000 0000 bである
私たちが自分で計算した結果とコンピュータで出力した結果を比較すると、プログラムが正しいと一致します.
正式にプログラミングができるようになりました
我々int型は定点数の1つの容器として,定点数32ビット,記号部分1ビット,整数部分15ビット,小数部分16ビットを仮定する
浮動小数点数の符号、整数部分と小数部分をそれぞれ得、定点数の各部分に対応する.
プログラム:
テスト:
入力
出力(16進)
出力(バイナリ)
8.25
84000
0000 0000 0000 1000 0100 0000 0000 0000 0000
-8.25
80084000
1000 0000 0000 1000 0100 0000 0000 0000 0000
私たちが前に指定したルールに従います:定点数のシンボルビット1ビット、整数ビット15ビット、小数ビット16ビット
バイナリを換算して、答えは正しいです.
知識の準備:
1.浮動小数点数を出力する16進数形式?(ポインタによる出力)
浮動小数点数ポインタ-を-整数ポインタに変換し、ポインタの内容を16進数で出力します.
サンプル・プログラム:
#include<stdio.h>
int main()
{
float *var;
scanf("%f",var);
printf("%x",*((int*)var));
}
テスト:
入力(float)
出力(16進)
バイナリ
8.25
41040000
0100 0001 0000 0100 0000 0000 0000 0000
-8.25
c1040000
1100 0001 0000 0100 0000 0000 0000 0000
浮動小数点数はコンピュータの記憶フォーマットにありますか?
シンボルビット:0は正、1は負;
指数位:シフト符号表示;
端数ビット:小数点以下のビットのみを暗黙的に格納する
例:
10進数:8.25
バイナリ:1000.01=1.00001 x 23=1.00001 x 2011
シンボルビット:0
指数位は:3+127=130=1000 0010 b
末尾番号:00001
最終的には、8.25コンピュータに記憶される形態は、0100 0001 0000 0100 0000 0000 0000 0000 0000 bである
私たちが自分で計算した結果とコンピュータで出力した結果を比較すると、プログラムが正しいと一致します.
正式にプログラミングができるようになりました
プログラミング:
我々int型は定点数の1つの容器として,定点数32ビット,記号部分1ビット,整数部分15ビット,小数部分16ビットを仮定する
浮動小数点数の符号、整数部分と小数部分をそれぞれ得、定点数の各部分に対応する.
プログラム:
#include<stdio.h>
#define SIGN_BIT 0x80000000
#define EXP_BIT 0x7f800000
#define TAIL_BIT 0x007fffff
int main()
{
float *aFloat;//
int aFix = 0;//
int tmp = 0;//
int exp = 0;//
int tail = 0;//
scanf("%f",aFloat);
tmp = *((int*)aFloat);//
aFix = tmp & SIGN_BIT;
//
exp = ((tmp & EXP_BIT) >> 23) - 127;//
tail = ((tmp & TAIL_BIT) | 0x00800000);//
aFix = aFix | ((tail >> (23-exp)) << 16);
//
aFix = aFix | ((tail & ~(0xffffffff << (23-exp))) >> (7-exp));
printf("%x
",aFix);
}
テスト:
入力
出力(16進)
出力(バイナリ)
8.25
84000
0000 0000 0000 1000 0100 0000 0000 0000 0000
-8.25
80084000
1000 0000 0000 1000 0100 0000 0000 0000 0000
私たちが前に指定したルールに従います:定点数のシンボルビット1ビット、整数ビット15ビット、小数ビット16ビット
バイナリを換算して、答えは正しいです.