十进制小数转二进制序列
2008-11-19 13:42
176 查看
这是一个我实验中首先要解决的问题,而且伴随着大量的重复运算。如果能够在每次操作中节省1ms,在N次运算后,就会体现巨大的时间差异!所以,我希望尽可能地写出高效率的代码。
二进制编码,我干脆采用bitset,节省空间,另外有基础算法可用。
转换的过程,大致可以分两种方式:
1,考虑到小数都是有精度限制的,比如精确到十进制小数点后5位;那么我可以将它转化为整数,然后再转化为bitset。采用整数编码方式,来记录小数。
2,按照《十进制小数转二进制小数方法》这篇文章中介绍的,采用乘以2的方式,得到每一位的数值,赋给bitset。同样是小数点后5位,那么最多需要17位二进制标示,我最多进行17次乘以2操作即可。通过if (i的整数部分==0)来进行设置。
这两种方法,谁的效率更高呢?按照我的想法,应该是第一种。因为第一种方法=一次乘法 + 一次bitset转换;第二种方法=17次乘法 + O(17)次赋值 + bitset初始化 + 17次if判断,显然后者更慢。
如果进行优化,效果又会如何呢?实验证明之!
#include <windows.h>
#include <time.h>
#include <bitset>
#include <iostream>
using namespace std;
const int MAX_COUNT=10000000;
void fun1()
{
double d=0.12345;
long i = d*100000;
bitset<100> bits(i);
}
void fun2()
{
double d=0.12345;
bitset<100> bits;
for (int i=0;i<17;i++)
{
d=d*2;
if (d>1.00000)
{
bits.set(100-i);//随便将某一位置1,在时间上没影响
}
}
}
void main()
{
SYSTEMTIME time1,time2;
GetSystemTime(&time1);
for (int i=0;i<MAX_COUNT;i++)
{
fun1();
}
GetSystemTime(&time2);
cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;
cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;
GetSystemTime(&time1);
for (i=0;i<MAX_COUNT;i++)
{
fun2();
}
GetSystemTime(&time2);
cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;
cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;
}
结论:采用第一种方式更加节省运算时间,编码方式更加直接。
0.12345,经第一种方式转化,bitset为:11000000111001
经第二种方式转化,bitset为:0.0001111110011010.....,显然两者连编码都是不一样的。
二进制编码,我干脆采用bitset,节省空间,另外有基础算法可用。
转换的过程,大致可以分两种方式:
1,考虑到小数都是有精度限制的,比如精确到十进制小数点后5位;那么我可以将它转化为整数,然后再转化为bitset。采用整数编码方式,来记录小数。
2,按照《十进制小数转二进制小数方法》这篇文章中介绍的,采用乘以2的方式,得到每一位的数值,赋给bitset。同样是小数点后5位,那么最多需要17位二进制标示,我最多进行17次乘以2操作即可。通过if (i的整数部分==0)来进行设置。
这两种方法,谁的效率更高呢?按照我的想法,应该是第一种。因为第一种方法=一次乘法 + 一次bitset转换;第二种方法=17次乘法 + O(17)次赋值 + bitset初始化 + 17次if判断,显然后者更慢。
如果进行优化,效果又会如何呢?实验证明之!
#include <windows.h>
#include <time.h>
#include <bitset>
#include <iostream>
using namespace std;
const int MAX_COUNT=10000000;
void fun1()
{
double d=0.12345;
long i = d*100000;
bitset<100> bits(i);
}
void fun2()
{
double d=0.12345;
bitset<100> bits;
for (int i=0;i<17;i++)
{
d=d*2;
if (d>1.00000)
{
bits.set(100-i);//随便将某一位置1,在时间上没影响
}
}
}
void main()
{
SYSTEMTIME time1,time2;
GetSystemTime(&time1);
for (int i=0;i<MAX_COUNT;i++)
{
fun1();
}
GetSystemTime(&time2);
cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;
cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;
GetSystemTime(&time1);
for (i=0;i<MAX_COUNT;i++)
{
fun2();
}
GetSystemTime(&time2);
cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;
cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;
}
结论:采用第一种方式更加节省运算时间,编码方式更加直接。
0.12345,经第一种方式转化,bitset为:11000000111001
经第二种方式转化,bitset为:0.0001111110011010.....,显然两者连编码都是不一样的。
相关文章推荐
- 十进制小数转为二进制小数
- 十进制小数转二进制
- 十进制转换为二进制序列,并输出1的个数,和序列的奇偶序列
- C语言实现十进制小数转二进制
- 十进制转换成二进制,十进制小数转换成二进制小数,二进制转换成十进制
- 二进制与十进制的相互转换(小数)
- java实现十进制整数或小数转换成二进制
- 十进制小数转换为二进制小数
- 十进制小数与二进制小数之间的互相转换
- 小数的十进制与二进制之间的转换
- HAPPY -1 填空1 Java --- 二进制(无小数部分)转换为十进制
- java实现十进制小数转换二进制
- 十进制浮点小数转换二进制注意的问题点
- Python实现的十进制小数与二进制小数相互转换功能
- 【计算机体系结构】十进制小数转换成二进制小数
- MODBUS协议 IEEE32位二进制浮点数与十进制小数转换的方法等内容
- 十进制与二进制相互转换(包括带小数点.各类进制转换公式)
- 十进制小数转二进制小数方法
- 正数(十进制)变二进制 除以2取余 小数(十进制)变二进制 乘以2取整数
- HAPPY -1 填空2 Java --- 十进制(带小数)转换为二进制