浮点数-转-定点数

知识准备:

1. 输出浮点数的十六进制形式?(利用指针输出)

将浮点数指针-转换成-整型指针,以十六进制的格式输出指针内容。

示例程序:
#include<stdio.h>

int main()
{
        float *var;

        scanf("%f",var);
        printf("%x",*((int*)var));
}
测试:
输入(float)输出(十六进制)二进制
8.25410400000100 0001 0000 0100 0000 0000 0000 0000
-8.25c10400001100 0001 0000 0100 0000 0000 0000 0000

浮点数在计算机的存储格式?

符号位:0为正,1为负;

指数位:移码表示;

尾数位:隐式存储小数点前面的1,也就是只存储小数点后面的位

示例:

十进制:8.25

二进制:1000.01 = 1.00001 x 2 3= 1.00001 x 2 011

符号位为:0

指数位为:3 + 127 = 130 = 1000 0010b

尾数位为:00001

最终,8.25在计算机中存储的形式为0100 0001 0000 0100 0000 0000 0000 0000b

对比我们自己计算出的结果 与 通过计算机输出的结果,一致:程序正确。

可以正式进行程序设计了

程序设计:

我们int型作为定点数的一个容器,假设定点数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\n",aFix);
}
测试:
输入输出(十六进制)输出(二进制)
8.25840000000 0000 0000 1000 0100 0000 0000 0000 0000
-8.25800840001000 0000 0000 1000 0100 0000 0000 0000 0000

按照我们前面指定的规则:定点数的符号位1位,整数位15位,小数位16位

将二进制换算出来,答案正确。

在Matlab中,将浮点数换为定点数通常涉及到两个主要步骤:首先确定定点数的表示格式,包括整数位数和小数位数;其次进行数值换。以下是一个简单的函数,用于将浮点数换为定点数表示: ```matlab function [fixed_point_number, max_abs_error] = float_to_fixed(float_number, total_bits, fractional_bits) % 检查输入参数 if total_bits < 2 || fractional_bits < 0 || fractional_bits >= total_bits error('总位数必须大于等于2,小数位数必须为非负且小于总位数。'); end % 计算定点表示的最大值 max_fixed_value = (2^fractional_bits - 1) * (2^(total_bits - fractional_bits - 1)); % 换为定点数 fixed_point_number = round(float_number * (2^fractional_bits)); % 计算最大绝对误差 max_abs_error = 0.5 * (2^(-fractional_bits)); end ``` 这个函数接受三个参数:`float_number` 是要换的浮点数,`total_bits` 是定点数的总位数(整数位加小数位),`fractional_bits` 是定点数的小数位数。函数返回定点数的表示和最大绝对误差。 解释: 1. 首先,我们检查输入参数的有效性。 2. 接着,我们计算定点数表示中的最大值,这是为了确保换后的定点数不会超出其能表示的最大范围。 3. 我们将浮点数乘以 `2^fractional_bits` 来将小数部分移至整数部分,然后使用 `round` 函数进行四舍五入到最接近的整数。 4. 最后,我们计算并返回定点数表示的最大绝对误差。这个误差是由于四舍五入引入的,而且是在定点数表示的最坏情况下可能出现的误差。 使用方法示例: ```matlab float_number = 0.15625; % 浮点数示例 total_bits = 8; % 总位数 fractional_bits = 3; % 小数位数 [fixed_point_number, max_abs_error] = float_to_fixed(float_number, total_bits, fractional_bits); disp(['定点数表示: ', num2str(fixed_point_number)]); disp(['最大绝对误差: ', num2str(max_abs_error)]); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值