【C语言模拟实现】浮点数-转-定点数

要想超神,就要什么都精!

知识准备:

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

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

示例程序:

#include<stdio.h>

int main()
{
        float *var;

        scanf("%f",var);
        printf("%x",*((int*)var));
}

测试

输入(float) 输出(十六进制) 二进制
8.25 41040000 0100 0001 0000 0100 0000 0000 0000 0000
-8.25 c1040000 1100 0001 0000 0100 0000 0000 0000 0000

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

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

指数位:移码表示;

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

示例:

十进制:8.25

二进制:1000.01 = 1.00001 x 23 = 1.00001 x 2011

符号位为: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.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位

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

时间: 2024-10-12 16:59:28

【C语言模拟实现】浮点数-转-定点数的相关文章

平方根的C语言实现(一) —— 浮点数的存储

曾经做一个硬件成本极度控制的项目,因为硬件成本极低,并且还需要实现较高的精度测量,过程中也自己用C语言实现了正弦.余弦.反正切.平方根等函数. 以下,无论是在我的实际项目中还是本地的计算机系统,int都是4个字节且机器为小端,除非特别提及,否则都如此默认.按理float的存储没有大小端之分,可是的确在powerpc大端上浮点数的存储也一样是和X86/ARM这样的小端机相反.不过因为正好因大小端而决定浮点数的存储顺序,那么本系列贴子里所有的C语言程序至少在powerpc大端上也是效果相同的. 尽管

语言模拟ATM自动取款机系统

C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入:用户输入密码,才能进入. 登陆成功界面:共有六个选项,查询余额.取款.存款.转账,修改密码,退出分别对应1,2,3,4,5,6选项,若序号输入不正确会予以提示. 选定1后,进入查询余额界面: 选定2后,进入取款界面: 选定3后,进入存款界面: 选定4后,修改密码,选定5,进入转账:选定6,退出界面:

关于c语言模拟c++的多态

关于c++多态,个人认为就是父类调用子类的方法,c++多态的实现主要通过虚函数实现,如果类中含有虚函数,就会出现虚函数表,具体c++多态可以参考<深度探索c++对象模型> c语言模拟多态主要通过函数指针实现,可以参考<Object Orientated Programming in ANSI-C> //shape.h #ifndef __SHAPE_H #define __SHAPE_H #include <stdio.h> #include <stdlib.h&

mysql 浮点数与定点数

浮点数一般用于表示含有小数部分的数值.当一个字段被定义为浮点类型后,如果插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然后插入,四舍五入的过程不会报错.在MySQL 中float.double(或real)用来表示浮点数. 定点数不同于浮点数,定点数实际上是以字符串形式存放的,所以定点数可以更加精确的保存数据. mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));Query OK, 0 rows a

MySQL浮点数和定点数

MySQL 分为两种方式:浮点数和定点数.浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示.定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据. 浮点数和定点数都可以用类型名称后加"(M,D)"的方式来进行表示,"(M,D)"表示该值一共显示 M 位数字(整数位+小数位),其中 D 位位于小数点后面,M 和 D 又称为精度和标度.例如,定义为 float(7,4)的一个列可以

DSP中浮点数和定点数 dsp

2020-04-08  21:54:53 1 DSP中的数据表述DSP中数据通常是有定点数与浮点数表示,其中可以对字长进行相关定义,可以选取字长为16位.24位.32位不同字长使用.而格式与字长决定了数据的精度与动态范围,同时也一定程度上决定了DSP处理器的功耗.成本与编程难度. 定点数:小数点位置为确定的. 浮点数:小数点位置可以改变. 定点运算的硬件实现较为简单,功耗较小,主要注意的是数据的定标.溢出以及误差. 浮点器减结构较为复杂,但是精度较高,高级语言容易支持. 2 定点数的格式与相关运

C语言::模拟实现strlen函数

编写一个C语言程序模拟实现strlen函数. 算法 strlen函数功能是计算字符串中字符的个数.(除\0外) 而字符串本身就是一个字符数组,只不过末尾以\0结束. 因此,我们只需遍历除\0之外的所有字符即可. 有三种方法可以解决这个问题. 算法总结 方法一:设置一个整型计数器,遍历字符串. 方法二:通过不断函数自身的递归. 方法三:与方法一类似,设置一个char*变量标记字符串尾部,通过指针相减得到字符长度. 核心代码 //方法一:通过设置整型计数器,模拟实现strlen函数. int my_

C语言::模拟实现strcmp函数

题目要求 编写一个C语言程序模拟实现strcmp函数. (我们依然先模拟实现strcmp函数,然后再对照string.h库中strcmp函数的实现,对比与大师之间的差距.) 算法分析 通过上一篇文章:C语言::strcmp函数功能.原型.用法及实例我们获得了strcmp函数的如下信息: strcmp原型:int strcmp( const char *s1, const char *s2 ); strcmp功能:将两个字符串自左向右逐个字符进行相比(根据ASCII值大小),直到出现不同的字符或遇

C语言::模拟实现strcat函数

题目要求 编写一个C语言程序模拟实现strcat函数. (我们不妨先模拟实现一下strcat函数,然后再对照一下string.h库函数中strcat函数代码的实现,与大师肩并肩.) 算法分析 strcat函数功能:将两个字符串连接起来,最终返回连接后字符串的首地址. strcat函数原型:char *strcat(char *dest,const char *src); 我们清楚地了解了strcat函数功能和原型之后,就很容易分析出算法... 算法总结 第一步:将dest指向的内容循环遍历至'\