【C言語シミュレーション実装】浮動小数点数-回転-定点数

3212 ワード

超神になるには、何でも精進しなければならない.

知識の準備:


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ビット
バイナリを換算して、答えは正しいです.