定点数与浮点数

                       **实验内容**

实验要求:
1 使用C语言, 输入数据格式为16比特的short类型, 定点字长配置为SI1F15,验证定点加法和乘法计算
2 使用Verilog语言, 输入数据为10比特,定点字长配置为SI1F9,验证定点加法和乘法计算
实验准备:
1 变量类型字长
明确处理器对应的变量字长, 通常32位处理器上变量类型的字长配置如下
int 表示 32比特(4字节)有符号整数
unsigned int 表示 32比特(4字节)无符号整数
short 表示 16比特(2字节)有符号整数
unsigned short 表示 16比特(2字节)无符号整数
char 表示 8比特(1字节)有符号整数
unsigned char 表示 8比特(1字节)无符号整数
float 表示 32位(4字节)单精度浮点数
double表示 表示 64位(8字节)双精度浮点数
2 定点加法
两个定点数相加时,需将小数部分字长调整一致,例如:3个 char 类型变量 A B C
变量A 为 SI2F6, 变量B 为 SI3F5, 变量C 为 SI4F4,则 C = (A >> 2)+(B >> 1),肯定不会溢出如果希望提高计算精度,则需要增加结果变量C的字长。声明 short C ,然后对齐 A、B的小数点C = A + (B << 1),此时 C 为 SI10F6格式
3 定点乘法
两个定点数相乘时,需要确保结果的字长不会溢出, 例如2个 char 类型变量 A B 相乘,乘法的全精度结果为16比特全精度乘法,结果需要使用short类型变量保存。假设A 为 SI1F7, B为SI1F7, C的类型为short,则C = A * B , C的定点格式为 SI2F14, (C >> 7)格式为 SI9F7。如果不希望给结果变量使用更高字长,可以先对乘数进行移位。例如 A/B/C 均为char类型, 定点格式均为 SI1F7
则: C = (A >> 3) * (B >> 4) 确定不会溢出,并且 C 仍然为 SI1F7格式
4 定点-浮点转换
a 浮点数转换为定点数,需要把浮点数乘以缩放因子然后取整, 例如
float A_f = 0.9 转换为 SI1F7格式的 char A_i
定义 SCALE = (1 << 7)
A_i = (char) (A_f * SCALE)
b 定点数转换为浮点数,需要把定点数除以缩放因子, 例如
SI1F7格式的 char A_i 转换为 float A_f
定义 SCALE = (1 << 7)
A_f = A_f * 1.0 / SCALE
其中 “* 1.0 ” 的操作 用于通知编译器进行类型转换, 避免做整数除法
实验代码

#include <stdio.h>

#define FL  15 // fraction length 
#define SCALE_FL     (1<<FL)
#define SCALE_FL_2   (1<<(FL*2))
mult_test(){

    float a_f, a_q; char  a_i;
    float b_f, b_q; char  b_i;
    float c_f, c_q; short c_i;

    a_f = -0.888;
    b_f = 0.888;
    a_i = a_f * SCALE_FL;    // fixed point value, S1I0F15
    b_i = b_f * SCALE_FL;
    a_q = a_i *1.0 / SCALE_FL;    // quant value
    b_q = b_i *1.0 / SCALE_FL;

    c_i = a_i * b_i;
    c_q = c_i*1.0 / SCALE_FL_2;
    c_f = a_f * b_f;


    printf("# Mult Test\n");
    printf("# Data Quant Fraction length is %d bit\n", FL);
    printf("# a_f =  %-10f, a_i = %-16d 0x%-16x , a_q = %f\n", a_f, a_i, a_i, a_q);
    printf("# b_f =  %-10f, b_i = %-16d 0x%-16x , b_q = %f\n", b_f, b_i, b_i, b_q);
    printf("# c_f =  %-10f, c_i = %-16d 0x%-16x , c_q = %f\n", c_f, c_i, c_i, c_q);
    printf("#\n");

}
add_test(){

    float a_f, a_q; char  a_i;
    float b_f, b_q; char  b_i;
    float c_f, c_q; short c_i;

    a_f = -0.888;
    b_f = -0.888;
    a_i = a_f * SCALE_FL;    // fixed point value, S1I0F15

    b_i = b_f * SCALE_FL;
    a_q = a_i *1.0 / SCALE_FL;    // quant value
    b_q = b_i *1.0 / SCALE_FL;

    c_i = a_i + b_i;
    c_q = c_i*1.0 / SCALE_FL;
    c_f = a_f + b_f;


    printf("# ADD Test\n");
    printf("# Data Quant Fraction length is %d bit\n", FL);
    printf("# a_f =  %-10f, a_i = %-16d 0x%-16x , a_q = %f\n", a_f, a_i, a_i, a_q);
    printf("# b_f =  %-10f, b_i = %-16d 0x%-16x , b_q = %f\n", b_f, b_i, b_i, b_q);
    printf("# c_f =  %-10f, c_i = %-16d 0x%-16x , c_q = %f\n", c_f, c_i, c_i, c_q);
    printf("#\n");

}

main(){

    printf("# Fixed point Demo LAB\n\n");
    mult_test();
    add_test();


    printf("# \n");
    printf("# Done, press Enter key to quit\n");
    getch();
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/a646123070/article/details/79719715