游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2876|回复: 4

自己写的字符串到double函数,没想到比库函数还快。大家

[复制链接]

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
发表于 2009-11-6 21:38:00 | 显示全部楼层 |阅读模式
自己写的字符串到double函数,没想到比库函数还快。

#include"EVOLVECommon.h"
using namespace std;

//转换字符串到double
double str_double(const char* p)
{
if(NULL==p)return 0;

char zhengshu[64]={0};
char xiaoshu[32]={0};
bool bDit=false;
bool bLoop=true;
long iz=0; //整数位数计数器
long ix=0; //小数位数计数器
while(0!=*p)
{
  switch(*p)
  {
   case '0':
    if(!bDit)
    {
     if(0!=iz)zhengshu[iz++]=*p;
    }
    else xiaoshu[ix++]=*p;
    break;
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
    if(!bDit)zhengshu[iz++]=*p;
    else xiaoshu[ix++]=*p;
    break;
   case '.':
    if(!bDit)bDit=true;
    else bLoop = false;
    break;
   default:break;
  }
  if(!bLoop || iz>=64 || ix>=32)break;
  ++p;
}
if(0==iz && 0==ix)return 0;
//求整数部分
double q = 1;//权数
double result = 0;//结果
while(iz-->=0)
{
  switch(zhengshu[iz])
  {
   case '0': break;
   case '1':
    result+=q;
    break;
   case '2':
    result+=2*q;
    break;
   case '3':
    result+=3*q;
    break;
   case '4':
    result+=4*q;
    break;
   case '5':
    result+=5*q;
    break;
   case '6':
    result+=6*q;
    break;
   case '7':
    result+=7*q;
    break;
   case '8':
    result+=8*q;
    break;
   case '9':
    result+=9*q;
    break;
   default: break;   
  }
  q*=10;
}
//求小数部分
q=0.1;
long k = 0;
while(k<ix)
{
  switch(xiaoshu[k])
  {
   case '0': break;
   case '1':
    result+=q;
    break;
   case '2':
    result+=2*q;
    break;
   case '3':
    result+=3*q;
    break;
   case '4':
    result+=4*q;
    break;
   case '5':
    result+=5*q;
    break;
   case '6':
    result+=6*q;
    break;
   case '7':
    result+=7*q;
    break;
   case '8':
    result+=8*q;
    break;
   case '9':
    result+=9*q;
    break;
   default: break;   
  }
  q*=0.1;
  ++k;
}
return result;
}

int main()
{
char s[] = "000.0041";
cout<<s<<endl;
t0=timer.get_time();
value = str_double(s);
t1=timer.get_time();
cout<<value<<endl;
cout<<"新算法耗时:"<<(t1-t0)*1000<<"ms"<<endl;

t0=timer.get_time();
value = atof(s);
t1=timer.get_time();
cout<<value<<endl;
cout<<"旧算法耗时:"<<(t1-t0)*1000<<"ms"<<endl;
return 0;
}
结果如下

3

主题

62

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2009-11-7 09:19:00 | 显示全部楼层

Re:自己写的字符串到double函数,没想到比库函数还快。大

http://blogger.org.cn/blog/more.asp?name=njucs&id=10145

3

主题

137

帖子

151

积分

注册会员

Rank: 2

积分
151
QQ
发表于 2009-11-16 16:18:00 | 显示全部楼层

Re:自己写的字符串到double函数,没想到比库函数还快。大

http://blog.csdn.net/aheroofeast/archive/2008/04/12/2284413.aspx

look一下我的,没有算法,速度也不慢撒。使用的template,可以应用到多个数据类型。

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
 楼主| 发表于 2009-11-17 11:49:00 | 显示全部楼层

Re: Re:自己写的字符串到double函数,没想到比库函数还快

骆驼祥子: Re:自己写的字符串到double函数,没想到比库函数还快。大家帮忙测试哈!

http://blog.csdn.net/aheroofeast/archive/2008/04/12/2284413.aspx

look一下我的,没有算法,速度也不...


我先前就一直再用,测了一下比C的atof()还慢,所以才决定自己写一个的。
//字符串转换为数值
template <typename T>
T string_value_A( const std::string& str )
{
T value;
std::stringstream( str.c_str() ) >> value;
return value;
}
int main()
{
//高精度定时器
high_timer timer;
if(!timer.initialize())
{
  wcout<<L"初始化定时器失败!"<<endl;
  return 0;
}
double t0=0, t1=0;
t0=timer.get_time();
double v1 = string_value_A<double>("0.15");
t1=timer.get_time();
cout<<"结果"<<v1<<ends;
cout<<"旧算法耗时:"<<(t1-t0)*1000<<"ms"<<endl<<endl;

t0=timer.get_time();
double v2 = str_double_A("0.15");
t1=timer.get_time();
cout<<"结果"<<v2<<ends;
cout<<"新算法耗时:"<<(t1-t0)*1000<<"ms"<<endl<<endl;

return 0;

}
结果如下:

3

主题

263

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2009-12-8 13:58:00 | 显示全部楼层

Re:自己写的字符串到double函数,没想到比库函数还快。大

呵呵,我没仔细看代码。
但是想提醒一下,库函数在debug模式下为了调试安全,经常加入判断信息,导致速度慢。
你的是在release下做的比较吗。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-17 17:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表