| 查看: 843 | 回复: 4 | |||
[求助]
一个C语言中的小问题 已有1人参与
|
| 我刚开始学语言。为什么C语言中实数要起个“浮点数”的名称?它在编程中有什么特殊的作用吗? |
» 猜你喜欢
全日制(定向)博士
已经有5人回复
假如你的研究生提出不合理要求
已经有10人回复
萌生出自己或许不适合搞科研的想法,现在跑or等等看?
已经有4人回复
Materials Today Chemistry审稿周期
已经有4人回复
参与限项
已经有3人回复
实验室接单子
已经有4人回复
对氯苯硼酸纯化
已经有3人回复
求助:我三月中下旬出站,青基依托单位怎么办?
已经有12人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
» 本主题相关价值贴推荐,对您同样有帮助:
keilc 软件求助
已经有4人回复
在解析晶体结构时,有没有什么方法把晶胞参数的a,b,c三个值的其中一个减小半?
已经有11人回复
一个关于石蜡油(又叫液体石蜡或白油)的问题!!!急!
已经有13人回复
求助精修cif数据及解决文件当中的A类B类C类错误
已经有5人回复
请教一个C++读文件的问题,
已经有12人回复
怎么在一个0矩阵中产生随机分布的1小矩阵
已经有4人回复
求一个简单的读写文件的小程序。。。
已经有4人回复
关于学习C语言所需时间问题
已经有10人回复
关于perl 数组的一个小问题。
已经有4人回复
请C语言的人们看看我这个最简单的小程序哪里有问题呢
已经有6人回复
求解 自学入门C语言,该选用什么资料?
已经有30人回复
单片机C语言编程中的自定义函数使用问题
已经有4人回复
C语言文件读写操作
已经有5人回复
13个C类错误怎么改啊
已经有11人回复
C语言变量问题,求助大侠!!
已经有17人回复
c语言求助,一个小程序详细讲解
已经有13人回复
一个区间搜索的c语言程序 出问题了
已经有8人回复
求C语言基本运算的运行时间分析
已经有10人回复
关于c语言的一个小问题 坐等回复啊 急啊 是关于建立数组的
已经有9人回复
c++中的负数求模问题
已经有4人回复
谭浩强C语言教材,P298页照着输入都不对!求原因
已经有12人回复
【求助】求一个关于文件读写的c语言小程序
已经有3人回复
Chris_D
银虫 (初入文坛)
- 应助: 3 (幼儿园)
- 金币: 423.9
- 帖子: 20
- 在线: 23.8小时
- 虫号: 3404684
- 注册: 2014-09-09
- 性别: GG
- 专业: 机构学与机器人
【答案】应助回帖
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
ddcy: 金币+8, ★★★很有帮助, good 2015-05-05 19:05:09
ddcy: 金币+8, ★★★很有帮助 2015-05-05 19:11:58
感谢参与,应助指数 +1
ddcy: 金币+8, ★★★很有帮助, good 2015-05-05 19:05:09
ddcy: 金币+8, ★★★很有帮助 2015-05-05 19:11:58
|
引用自 http://blog.163.com/wmk_2000_ren ... 461922010342395113/ 什么是定点数、浮点数? 首先我们要认清一个概念,定点数不一定是整数,浮点数不一定是小数。 如其名,浮点数和定点数的区别就在于浮点和定点上,点就是指小数点。浮点数就是小数点是浮动的,定点数就是小数点是固定不动的。 具体,什么是浮点数? 浮点数是在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p 位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。 对于一些外文资料中,指数即:exponent,尾数即:mantissa。 在IEEE 754中,定义了两种浮点数,即我们熟悉的float和double型。对于float型的浮点数来说,最高一位是符号位,不用说了,1为负号,0为正。紧跟着指数位是8位,尾数是23位。由于尾数是规格化的,最高一位肯定非零,并且最高一位隐藏。所以对于尾数来说,实际上可以有 23+1=24位。 比如说,如果mantissa为010,exponent为3,s为0,则尾数实际上是1.010,因此这个数是+1.010*2^3=1010b,即为十进制10.0。 Double的位数说明类似于float。 什么是定点数? 我们在上述的浮点数中可以看到,浮点的小数位是可变的(随exponent变化),因此浮点数可表达的小数范围非常广。但浮点数运算量非常大(从它的定义上就知道了)。并且在目前市场占有量最大的定点DSP并不支持浮点运算。 因此,定点数应运而生。定点数就是指在一个数中,整数部分和小数部分位数固定。比如,我们定点数总共32位,其中小数占低13位: typedef int fix_t; #define FIX_FRACBITS 13 如何将一个int型的整数转化为定点数? Int类型转定点数最简单。上面的定义,小数位占低13位。 #define INTTOFIX(fix_t, fracbits, x) fix_t((x) << (fracbits)) 即我们只需要将x左移就行了,当然要注意,如果x本身超过了整数部分的最大位数,则会产生溢出。 如何将一个double型小数转化为定点数? 浮点数转为定点数与int型转为定点数类似,比如说1.1101,转为有13位小数的定点数就是1 1 1010 0000 0000,也就是1.1101*2^13。 当然,在int型转定点时,我们使用了逻辑运算,而不是直接乘以2^13,是因为逻辑运算的速度一般比算术运算快几十倍。但是逻辑左移并不能运用于小数,double转定点时于是只能用算术乘法了。 下面是double转定点: #define DBLTOFIX(fix_t, fracbits, x) \ fix_t(((x) * (double)((fix_t)(1) << (fracbits)))) ) 定点数直接如何相加? 很简单,如下。如下,下面的宏定义的定点数相加没有考虑到数据溢出的问题,如果当x和y同号并且两数足够大时,是会产生数据位溢出的。在具体编程实现时要特别注意。 #define FIX_ADD(fix_t, fracbits, x, y) ((x) + (y)) 定点数如何相乘? 乘法更容易产生数据位溢出的问题,因此,如果我们运算时就要特别小心。同样,也是没有考虑到数据溢出的问题。 Typedef _int64 fixbig_t; #define FIX_MUL(fix_t, fracbits, bigfix_t, x, y) \ Fix_t((bigfix_t(x) * bigfix_t(y)) >> (fracbits)) 定点数如何实现除法? 如下式所示,我们把移位放到被除数那里,是因为这样的处理基本上不会产生下溢出,提高了精度。 #define JAS_FIX_DIV_FAST(fix_t, fracbits, bigfix_t, x, y) \ JAS_CAST(fix_t, (JAS_CAST(bigfix_t, x) << (fracbits)) / (y)) |
2楼2015-05-05 09:19:00
3楼2015-05-05 16:27:53
liaor1999
银虫 (小有名气)
- 应助: 2 (幼儿园)
- 金币: 389.7
- 帖子: 94
- 在线: 22小时
- 虫号: 1622055
- 注册: 2012-02-17
- 性别: GG
- 专业: 计算机应用技术

4楼2015-05-13 17:04:08
liu2012huan
铜虫 (正式写手)
- 应助: 12 (小学生)
- 金币: 383.5
- 红花: 2
- 帖子: 307
- 在线: 22.4小时
- 虫号: 2076886
- 注册: 2012-10-21
- 性别: GG
- 专业: 计算机软件

5楼2015-05-14 23:10:46












回复此楼