代码分析将double类型的浮点数转换成二进制-实例
2013-03-05 23:29
651 查看
整个实例都在艾这里,注释齐全,欢迎同行指正,补充
运行结果
上面的代码在转成数组的时候不太健壮,修改了一下
注意区别,已经注释:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class program { static void Main(string[] args) { string S, E, M;//分别储存符号位,指数值,尾数 double num = -1234.5678;//随便定义一个双精度浮点数 string[] numBinArr = getFloatPartToBin(Math.Abs(num)); string strINtAndFlo = numBinArr[0] + "." + numBinArr[1];//获得整数部分二进制和小数部分二进制的组合字符串 int dotPos = strINtAndFlo.IndexOf('.');//小数点位置 int firstOne = strINtAndFlo.IndexOf('1');//有效1的位置 int MovCount=(dotPos-firstOne-1);//移动矢量(值可以正负) Console.WriteLine(num+"的整数和小数部分组合起来的二进制形式是:\n"+strINtAndFlo); Console.WriteLine("小数点的位置是:" + dotPos); Console.WriteLine("从左边起第一个有效数字一是:" + firstOne); Console.WriteLine("因此,小数点移动的位移矢量值是:" + MovCount); //分析出符号位的值 if (num<0) {S = "1"; } else { S = "0"; } Console.WriteLine("S符号位的值是:"+S); //分析出E指数的值 E = Convert.ToString(MovCount + 1023, 2); Console.WriteLine("E11位的值是:" + E.PadLeft(11,'0')); //得到M M = (numBinArr[0] + numBinArr[1]).Substring(1, 52); Console.WriteLine("M52位的值是:" + M); Console.WriteLine("双精度数[" + num + "]的二进制形式是:\n" + S + E + M ); } /// <summary> /// 获取小数部分的二进制形式 /// </summary> /// <param name="num"></param> /// <returns></returns> public static string[] getFloatPartToBin(double num) { string FloatBin = "";//保留浮点尾数部分的二进制形式 string[] numSplit = num.ToString().Split('.');//把双精度浮点数分成整数和小数部分 string[] returnValue=new string[2];//用来返回整数和小数部分的二进制值 double fd=double.Parse("0."+numSplit[1]); while (fd != 1.0d) { if (fd * 2 >= 1.0) { fd = fd *2- 1.0d; FloatBin += "1"; } else { fd = fd * 2; FloatBin += "0"; } if (Convert.ToString(long.Parse(numSplit[0]), 2).Length + FloatBin.Length >= 53) { break;//如果尾数的位数已经达到了上限,就停止尾数的转换 } } returnValue[0]=Convert.ToString(long.Parse( numSplit[0]),2); returnValue[1]=FloatBin; return returnValue; } } }
运行结果
上面的代码在转成数组的时候不太健壮,修改了一下
注意区别,已经注释:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class program { static void Main(string[] args) { string S, E, M;//分别储存符号位,指数值,尾数 double num =-1d;//随便定义一个双精度浮点数 string[] numBinArr = getFloatPartToBin(Math.Abs(num)); string strINtAndFlo = numBinArr[0] + "." + numBinArr[1];//获得整数部分二进制和小数部分二进制的组合字符串 int dotPos = strINtAndFlo.IndexOf('.');//小数点位置 int firstOne = strINtAndFlo.IndexOf('1');//有效1的位置 int MovCount=(dotPos-firstOne-1);//移动矢量(值可以正负) Console.WriteLine(num+"的整数和小数部分组合起来的二进制形式是:\n"+strINtAndFlo); Console.WriteLine("小数点的位置是:" + dotPos); Console.WriteLine("从左边起第一个有效数字一是:" + firstOne); Console.WriteLine("因此,小数点移动的位移矢量值是:" + MovCount); //分析出符号位的值 if (num<0) {S = "1"; } else { S = "0"; } Console.WriteLine("S符号位的值是:"+S); //分析出E指数的值 E = Convert.ToString(MovCount + 1023, 2); Console.WriteLine("E11位的值是:" + E.PadLeft(11,'0')); //得到M M = (numBinArr[0] + numBinArr[1]).Substring(1, 52); Console.WriteLine("M52位的值是:" + M); Console.WriteLine("双精度数[" + num + "]的二进制形式是:\n" + S + E + M ); } /// <summary> /// 获取小数部分的二进制形式 /// </summary> /// <param name="num"></param> /// <returns></returns> public static string[] getFloatPartToBin(double num) { string FloatBin = "";//保留浮点尾数部分的二进制形式 //Console.WriteLine(Convert.ToString( num)); string[] numSplit = (num.ToString("f")).Split('.');//把双精度浮点数分成整数和小数部分,格式为f,默认小数两位,否则像1这样的整数就会失去后面的0,千万记住 string[] returnValue=new string[2];//用来返回整数和小数部分的二进制值 double fd=double.Parse("0."+numSplit[1]); while (fd != 1.0d) { if (fd * 2 >= 1.0) { fd = fd *2- 1.0d; FloatBin += "1"; } else { fd = fd * 2; FloatBin += "0"; } if (Convert.ToString(long.Parse(numSplit[0]), 2).Length + FloatBin.Length >= 53) { break;//如果尾数的位数已经达到了上限,就停止尾数的转换 } } returnValue[0]=Convert.ToString(long.Parse( numSplit[0]),2); returnValue[1]=FloatBin; return returnValue; } } }
相关文章推荐
- struts2中类型转换实例代码
- 利用IO流进行基本类型同二进制的转换,以double为例
- JS面试题大坑之隐式类型转换实例代码
- GO语言类型转换和类型断言实例分析
- [置顶] Python和Java的类型转换实例与分析
- C语言中自动隐式转换与类型强制转换实例分析
- C++ 十进制转换为二进制的实例代码
- java浮点类型float精度与Double精度范围实例使用说明
- 几行代码道出了指针,类型转换,浮点存储,小端存储的本质
- VC字符串类型CString,int,char*,string互相转换代码实例
- VC字符串类型CString,int,char*,string,wchar_t互相转换代码实例(转自闪电博客)
- C语言数据类型转换实例代码
- python编程开发之类型转换convert实例分析
- opencv中Mat类型操作或转换代码分析
- C/C++ 关于float和double类型与二进制的转换实现。。
- 个人学习代码保存:例9.在存储过程中使用cast 类型转换的实例
- javascript显式类型转换实例分析
- 分析2个代码片段(数值范围,类型转换相关)
- C#自定义类型强制转换实例分析
- C++浮点数(float、double)类型数据比较、转换分析总结