浮点数二进制?

OUGNM 2012-06-05 11:07:56
http://hi.baidu.com/linminglu/blog/item/774240eea7f06ff3b3fb951f.html

"2.025675
1. 整数部分2,二进制为10; 小数部分0.025675,
二进制是.0000011010010010101001,先把他们连起来,从第一个1数起取24位(后面补0):
10.0000011010010010101001 "

一,十进制:2.025675,其小数部分,转二进制:.0000011010010010101001,不对啊。

0.025675
0.05315 0
0.1027 0
0.1027 0
0.4108 0
0.8216 0
1.6432 1
1.2864 1
0.5728 0
1.1456 1
0.2912 0
0.5824 0
1.1648 1
0.3296 0
0.6592 0
1.3184 1
0.6368 0
1.2736 1
0.5472 0
1.0944 1
0.1888 0
0.3776 0
0.7552 0
1.5104 1

应该是:.00000110100100101010001 ,对否?

二,“先把他们连起来,从第一个1数起取24位(后面补0):”
这句话也有错误,float单精度浮点数,其尾数应该是:23位。对否?
...全文
226 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangbch 2012-06-06
  • 打赏
  • 举报
回复
楼主关于浮点数这个话题,发了5-6个帖子了,我也详细解释过好多遍了,怎么就是理解不了呢?有那么难吗?
OUGNM 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

去看《数字电路》吧
[/Quote]

关这个屁事!
pathuang68 2012-06-06
  • 打赏
  • 举报
回复
去看《数字电路》吧
OUGNM 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

0.025675转化为2进制,使用Excel表格,很容易得到结果

十进制 *2 进位
0.02567500 0.05135000 0
0.05135000 0.10270000 0
0.10270000 0.20540000 0
0.20540000 0.41080000 0
0.41080000 0.82160000 ……
[/Quote]

"2.025675
1. 整数部分2,二进制为10; 小数部分0.025675,
二进制是.0000011010010010101001,先把他们连起来,从第一个1数起取24位(后面补0):
10.0000011010010010101001 "

一,上面的链接说,2.025675转二进制是:
10.0000011010010010101001

二,楼上说,其二进制是:
10.0000011010010010101000

10.0000011010010010101001
10.0000011010010010101000

并不相同!

float浮点数转二进制,整数部分2位+小数部分22位=24位,再去除最高位.

链接是错误了?
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
float.h
...
#define DBL_DIG 15 /* # of decimal digits of precision */
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG 53 /* # of bits in mantissa */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP 308 /* max decimal exponent */
#define DBL_MAX_EXP 1024 /* max binary exponent */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
#define DBL_MIN_EXP (-1021) /* min binary exponent */
#define _DBL_RADIX 2 /* exponent radix */
#define _DBL_ROUNDS 1 /* addition rounding: near */

#define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD 0
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MAX_10_EXP 38 /* max decimal exponent */
#define FLT_MAX_EXP 128 /* max binary exponent */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
#define FLT_MIN_EXP (-125) /* min binary exponent */
#define FLT_NORMALIZE 0
#define FLT_RADIX 2 /* exponent radix */
#define FLT_ROUNDS 1 /* addition rounding: near */
...
liangbch 2012-06-05
  • 打赏
  • 举报
回复
最高位自然是整数部分“10”中的1了
OUGNM 2012-06-05
  • 打赏
  • 举报
回复
“小数部分的前22bit是 0000011010010010101000
整数部分2的2进制表示是10, 整数部分的2位+小数部分的22位,总共24位,不存储最高位,只存储剩下的23位,他们是00000011010010010101000”

什么是最高位?
liangbch 2012-06-05
  • 打赏
  • 举报
回复
0.025675转化为2进制,使用Excel表格,很容易得到结果

十进制 *2 进位
0.02567500 0.05135000 0
0.05135000 0.10270000 0
0.10270000 0.20540000 0
0.20540000 0.41080000 0
0.41080000 0.82160000 0
0.82160000 1.64320000 1
0.64320000 1.28640000 1
0.28640000 0.57280000 0
0.57280000 1.14560000 1
0.14560000 0.29120000 0
0.29120000 0.58240000 0
0.58240000 1.16480000 1
0.16480000 0.32960000 0
0.32960000 0.65920000 0
0.65920000 1.31840000 1
0.31840000 0.63680000 0
0.63680000 1.27360000 1
0.27360000 0.54720000 0
0.54720000 1.09440000 1
0.09440000 0.18880000 0
0.18880000 0.37760000 0
0.37760000 0.75520000 0
0.75520000 1.51040000 1
0.51040000 1.02080000 1
0.02080000 0.04160000 0
0.04160000 0.08320000 0
0.08320000 0.16640000 0

小数部分的前22bit是 0000011010010010101000
整数部分2的2进制表示是10, 整数部分的2位+小数部分的22位,总共24位,不存储最高位,只存储剩下的23位,他们是00000011010010010101000
Corner 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
十进制浮点数的小数部分转二进制,'乘'二取整,'顺序'排列。取23位,对否?
[/Quote]
并非是小数部分取23位,是总共取23位
OUGNM 2012-06-05
  • 打赏
  • 举报
回复

十进制浮点数的小数部分转二进制,'乘'二取整,'顺序'排列。取23位,对否?
OUGNM 2012-06-05
  • 打赏
  • 举报
回复
"2.025675
1. 整数部分2,二进制为10; 小数部分0.025675,
二进制是.0000011010010010101001,先把他们连起来,从第一个1数起取24位(后面补0):
10.0000011010010010101001 "

链接说,二进制:.0000011010010010101001,共22位。


十进制:0.025675
0.05315 0
0.1027 0
0.1027 0
0.4108 0
0.8216 0
1.6432 1
1.2864 1
0.5728 0
1.1456 1
0.2912 0
0.5824 0
1.1648 1
0.3296 0
0.6592 0
1.3184 1
0.6368 0
1.2736 1
0.5472 0
1.0944 1
0.1888 0
0.3776 0
0.7552 0
1.5104 1

二进制浮点数的小数部分转二进制,'乘'二取整,'顺序'排列。取23位,对否?

如果是这样,

应该是:.00000110100100101010001,23位。
而不是:.0000011010010010101001 ,22位?
liangbch 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
关于浮点数的格式,我在 http://topic.csdn.net/u/20120531/11/78d9716a-6fd3-4233-a3c1-e63e59d6de70.html的3楼已经说的很清楚了,怀疑楼主没有仔细读,或者没有读懂。
[/Quote]

Sorry, 此楼主非彼楼主也。
liangbch 2012-06-05
  • 打赏
  • 举报
回复
楼主还没有弄明白?
我再说一遍
十进制数 "2.025675“的2进制表示 为"10.0000011010010010101001"
"10.0000011010010010101001(b)"= 1.00000011010010010101001(b) * 2^1
1.00000011010010010101001(b)为尾数,1为阶码

因为,规约化的浮点数的尾数总是大于等于1而小于2,意味着其尾数最高位总是1,故在最高位是不存储的。
阶码为1,其移码表示为128,移码的二进制表示“10000000”

1.00000011010010010101001总共有24bit,除去最高位的1,就只剩下23比特了。

故“先把他们连起来,从第一个1数起取24位(后面补0):”这句话说的是有些问题,应该说成
“先把他们连起来,从第一个1数起取24位(后面补0):然后将最高位那个1删除,存储其余的23位”



关于浮点数的格式,我在 http://topic.csdn.net/u/20120531/11/78d9716a-6fd3-4233-a3c1-e63e59d6de70.html的3楼已经说的很清楚了,怀疑楼主没有仔细读,或者没有读懂。

[Quote]
首先将浮点是f表示为 s * a * 2^k 的形式,s=1 或者 -1. a>=1.0 而小于 2.0
s=1,则浮点数是整数,则bit31=0, 否则浮点数是负数,bit31=1
阶码实际存储为 k+127.
因为尾数a,最高bit总是1(大于1.0),故存储时略去最高bit,而存储其余的23bit
[/Quote]



Corner 2012-06-05
  • 打赏
  • 举报
回复
浮点存储结构
①浮点(以单精度为例)数共32位(floatNumArray[32]),共分为三部分,第一部分是最后一位为正负位(loatNumArray[31]),第二部分是前23位为小数位/基数位/S(loatNumArray[0]-loatNumArray[22]),最后一部分是中间8位为指数位/E(loatNumArray[23]-loatNumArray[30])
②内存->浮点数 计算方式: S*(2^E)
③浮点数->内存 计算方式:将浮点数(a.b/3.5)的整数部分和小数部分分别用二进制表示得到其二进制形式(11.1),然后使用科学技术方式表达(1.11*(2^1)),所以符号位为1,基数位为11000000000000000000000(因为2进制科学计数法第一位必然是1,所以省略),指数位为00000001。
④指数部分不采用符号位,所以使用偏移(127)来计入负数,即上述1应该为128
OUGNM 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

float.h
C/C++ code
...
#define DBL_DIG 15 /* # of decimal digits of precision */
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON !……
[/Quote]

什么东东!

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧