今天给各位分享c语言十进制浮点数转二进制的知识,其中也会对c语言浮点数转16进制进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、vc 想把编辑框里的float型的十进制数据转为二进制的float或int型数据怎么写??2、如何手算十进制浮点数转二进制(IEEE754-32位)浮点数3、c语言初学,求解4、c语言如何把浮点数转换成二进制5、10进制浮点数怎么转2进制,方法
vc 想把编辑框里的float型的十进制数据转为二进制的float或int型数据怎么写??
如果是要把串转成数存到变量中, 并不存在10进制还是二进制的说法,
先GetDlgItemText取得编译框内容, 再atof转成浮点数. 或用atoi转成整数.
如果想要把一个整数按二进制形式显示, 很容易办到, 只需一个循环:最高位是1就打印出一个’1′,否则找印出个’0′, 再左移1位.
浮点按二进制显示要麻烦些, 先分出整数部分和小数部分(小数部分涉及取几位), 再分别按整数的方法转换, 中问加个点就可以啦.
如何手算十进制浮点数转二进制(IEEE754-32位)浮点数
在这篇文章中我们将以数字263.3为例
数字263.3的整数部分为263
将得到的余数从下往上抄成一行,得263的二进制表达为 100000111
数字263.3的小数部分为0.3
将最右列从上往下抄成一行,并添加到263的二进制表达之后,中间以小数点分隔,得:
通过小数点向左移8位,得:
IEEE754-32位单精度浮点数规范为
符号位元由目标数字的符号决定,负数为1,非负数为0。因263.3为正数,故符号位为0
指数部分为 偏正值+表示值。 IEEE754规范下的32位单精度浮点数偏正值为127。故指数部分为127 + 8 = 135, 即1000 0111
小数部分为第三步得到的 二进制科学计数法 形式下小数点后23位, 即 0000 0111 0100 1100 110
最后,得263.3的二进制形式:
0(符号位)10000111(指数部分)00000111010011001100110(小数部分),即:
因位数有限,没取完的无限循环部分会被舍去,因此十进制数在转化成二进制后再转回十进制时会出现误差,会造成浮点数运算的精度问题,也就是0.1+0.2!=0.3的情况。若有兴趣了解各程序语言对浮点数运算精度问题的处理情况,可浏览:
c语言初学,求解
这是由于浮点数误差导致的。其根本原因是计算机所使用二进制01代码无法准确表示某些带小数位的十进制数据。我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:
1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称”除2取余法”。
2. 小数部分:十进制小数转换为二进制小数,采用”乘2取整,顺序排列”法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称”乘2取整法”。
3. 含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。
这导致了一个显而易见的问题:有些十进制数无法转换为有限的二进制数:
(0.65)10 = (0.101001100110011001100110011001100110011……)2
(0.6) 10 = (0.10011001100110011001100110011001100110011……)2
后面的省略号表示已经算不完了,后面在无限重复 0011 这段二进制数值
目前计算机上存储浮点数值是按照IEEE(电气和电子工程师协会)754浮点存储格式标准来存储的。
IEEE单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。如下图所示:
也就是说上面将0.65及0.5转换出的二进制代码,我们只能存储23位,即使数据类型为double,也只能存储52位,这样大家便能看出问题出现的原因了。
可惜的的是我们无法从根本上解决问题,除非你能发明十进制计算机,但我们可以曲线救国:
因为二进制数值可以准确表示整数(可以使用整数转换为二进制方法验证下),所以可以将小数乘以10或100等变成整数,然后做整数运算,最后再通过除以10或100等获得结果;
2. 通过截取结果的有效小数位数等,来取得最好的近似结果,然后在做处理。
3. 对于可以用有限长度的二进制数值表示的十进制数值,可以使用存储位数大于其长度的数据类型。
参考CNSD
c语言如何把浮点数转换成二进制
这就设计到浮点数的 表示方法了:
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
符号位(Sign) : 0代表正,1代表为负
指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为:
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*,而120.5可以表示为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为1.0001*,1110110.1可以表示为1.1101101*,任何一个数都的科学计数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127。
下面就看看8.25和120.5在内存中真正的存储方式。
首先看下8.25,用二进制的科学计数法表示为:1.0001*
按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示:
而单精度浮点数120.5的存储方式如下图所示:
那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据:0100001011101101000000000000,首先我们现将该数据分段,0 10000 0101 110 1101 0000 0000 0000 0000,在内存中的存储就为下图所示:
根据我们的计算方式,可以计算出,这样一组数据表示为:1.1101101*=120.5
而双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数。所以这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的
下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果
float f = 2.2f;
double d = (double)f;
Console.WriteLine(d.ToString(“0.0000000000000”));
f = 2.25f;
d = (double)f;
Console.WriteLine(d.ToString(“0.0000000000000”));
可能输出的结果让大家疑惑不解,单精度的2.2转换为双精度后,精确到小数点后13位后变为了2.2000000476837,而单精度的2.25转换为双精度后,变为了2.2500000000000,为何2.2在转换后的数值更改了而2.25却没有更改呢?很奇怪吧?其实通过上面关于两种存储结果的介绍,我们已经大概能找到答案。首先我们看看2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的,而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数的方法为将小数*2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.8*2=1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011… ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储为:
但是这样存储方式,换算成十进制的值,却不会是2.2的,应为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果
了解了浮点数的存储方式后,转成二进制应该就简单很多了,希望这点东西对你有用,望采纳!
10进制浮点数怎么转2进制,方法
二进制每位上基数的写法:8 4 2 1,个位1,高位=低位*2
十进制转二进制:10D=?B
写基数写到比10大时停止,用写出的基数从高位到低位将10凑出来,用到的下面写1,否则0
16 8 4 2 1 按位对齐写
0 1 0 1 0
10=8+2=1*8+0*4+1*2+0*1,所以10D=1010B
关于c语言十进制浮点数转二进制和c语言浮点数转16进制的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。