如何用C语言定义IEEE754标准的浮点数

Python016

如何用C语言定义IEEE754标准的浮点数,第1张

C语言就是用IEEE 754标准

float 是 32 位 浮点数

double 是 64 位 浮点数

浮点数的字节内容可以用 union 破解:

union {

float x

unsigned char s[4]

} F32

F32.x = 1.23456

for (i=0i<4i++) printf("%x",F32.s[i])

16进制1位拉4位,得 2进制内容。

union {

double y

unsigned char t[8]

} F64

F64.y = 1.23456

for (i=0i<8i++) printf("%x",F64.t[i])

16进制1位拉4位,得 2进制内容。

/* $begin show-bytes */

#include <stdio.h>

typedef unsigned char *byte_pointer

void show_bytes(byte_pointer start, int len)

{

    int i

    //原来的代码 for (i = 0 i < len i++)

    for (i = len-1 i >=0 i--)

    {

        printf(" %.2x", start[i])

    }

    printf("\n")

}

void show_int(int x)

{

    float oneFloat

    oneFloat=(float)x

    show_bytes((byte_pointer) &oneFloat, sizeof(float))

    //原来的代码show_bytes((byte_pointer) &x, sizeof(int))

}

void show_float(float x)

{

    show_bytes((byte_pointer) &x, sizeof(float))

}

void show_pointer(void *x)

{

    show_bytes((byte_pointer) &x, sizeof(void *))

}

/* $end show-bytes */

/* $begin test-show-bytes */

void test_show_bytes(int val)

{

    int ival = val

    float fval = (float) ival

    int *pval = &ival

    show_int(ival)

    show_float(fval)

    show_pointer(pval)

}

/* $end test-show-bytes */

void simple_show()

{

    /* $begin simple-show */

    int val = 0x12345678

    byte_pointer valp = (byte_pointer) &val

    show_bytes(valp, 1) /* A. */

    show_bytes(valp, 2) /* B. */

    show_bytes(valp, 3) /* C. */

    /* $end simple-show */

}

void float_eg()

{

    /* $begin float-show */

    int x = 3490593

    float f = (float) x

    show_int(x)

    show_float(f)

    /* $end float-show */

}

void string_eg()

{

    /* $begin show-string */

    char *s = "ABCDEF"

    show_bytes(s, strlen(s))

    /* $end show-string */

}

void show_twocomp()

{

    /* $begin show-twocomp */

    short int x = 12345

    short int mx = -x

    show_bytes((byte_pointer) &x, sizeof(short int))

    show_bytes((byte_pointer) &mx, sizeof(short int))

    /* $end show-twocomp */

}

int main(int argc, char *argv[])

{

    //十进制数520的十六进制数是00000208H,

    //正确的32位浮点是44020000H,内存从低位开始放置00 00 02 44

    //十进制数100的十六进制数是00000064H,

    //正确的32位浮点是42C80000H,内存从低位开始放置00 00 C8 42

    int num

    printf("Input one integer:")

    scanf("%d",&num)

    printf("\n")

    show_int(num) //十进制整数转换为32位浮点

    printf("\n")

    return 0

}

c语言中单精度数和双精度数的本质区别在于数据类型所占的内存字节,浮点数,在C语言中使用的是IEEE754浮点数编码,该标准规定了单精度浮点数和双精度浮点数所占的内存字节,一般单精度数占用4个字节,双精度数占用8个字节,扩展双精度数占用80个字节。IEEE754具体的标准如下:

格式 长度 符号位 指数位 尾数位 有效位数 指数偏移 尾数说明

单精度 32 1 8 23 24127 有一位隐含位

双精度 64 1 11 52 53 1023 有一位隐含位

扩展双精度 80 1 15 64 64 16383 没有隐含位