作者lairrol (趴趴蓝)
看板C_and_CPP
标题[问题] 两种写法的差异
时间Tue Jul 28 19:24:49 2009
小弟之前有发文询问浮点数比较的问题
现在为了要解决这个问题我爬文之後学到把浮点数转成字串再比较的方法
为了解决我的问题我实做了两种方法
1.把原本的浮点数改成整数去做比较
2.把浮点数转成字串去做比较
要比较的浮点数类型 => x.y
改成整数 => x.y * 10 = xy
方法1的部份code:
...........
int a,b;
int c[i]
if(a = = b) c[i]=a;
...........
方法2的部份code:
...........
char str1[4],str2[4];
double s1,s2;
double c[i]
sprintf(str1,"%2.1f",s1);
sprintf(str2,"%2.1f",s2);
if( (strcmp(str1,str2)) = = 0 ) c[i]=s1;
...........
两种方法差别在比较这一部份
其他的东西都大同小异,但是两种方法的执行时间差蛮多的
方法1执行不到5秒结果就出来了
方法2执行大约是36~40秒之间
我的疑问是两种方法为什麽执行时间会相差那多?
p.s:
我在跑方法2的时候跑太久还以为程式当掉了一直关掉找bug
结果找很久没找到反而是因为尿急先放着回来结果就出来了...还正确无误=.="
恳请版友帮我解惑!!谢谢
--
态度决定你的
高度
你有多
高?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.114.166.192
1F:→ dendrobium:fcn用起来只有一行 跑起来可不只一行 07/28 19:34
2F:推 StubbornLin:不太懂为什float要转字串再比 07/28 19:38
3F:→ StubbornLin:float再怎麽慢可能也只是一个指令好几个周期 07/28 19:38
4F:→ StubbornLin:你先转字串 这之间就不知道跑多少个指令 07/28 19:39
5F:→ StubbornLin:接着字串比对又走访整个阵列 当然慢= = 07/28 19:39
6F:推 VictorTom:string的处理本来就比基本型别速度慢上很多, 就像1F说的 07/28 20:04
7F:→ VictorTom:程式写起来是一行func call, 背後要做都少事请disasm看. 07/28 20:05
8F:→ VictorTom:顺便说, %2.1f, 就算整数不超过2位, 也可能放不下'\0'. 07/28 20:07
9F:→ VictorTom:顺便回2F, 原po只是想用不同比较方法来避开float精确度 07/28 20:08
10F:→ VictorTom:问题不适合直接用 == 的case吧我猜....@_@" 07/28 20:08
11F:推 abcabcabc:我跟2F的疑问好像一样耶 07/28 20:20
12F:推 VictorTom:去看 #1AO_CbEU 这篇, 最近a大刚好回过....~_~ 07/28 21:22
13F:→ lairrol:没错!!我遇到的问题就是要避开精确度~我刚睡醒有想到一个 07/29 04:30
14F:→ lairrol:新方法耶....把两个浮点数转成二进位码去比较会比较快吗? 07/29 04:31
15F:→ lairrol:可以自己决定精准度然後又避开字串的处理 07/29 04:32
16F:推 VictorTom:楼上, 理论上不会~_~ 任何一个浮点数要储存都可以会经过 07/29 09:28
17F:→ VictorTom:truncate後, 最後用32bit或64bit的空间储存起来.... 07/29 09:28
18F:→ VictorTom:所以浮点直接==不出来的, 32/64 bit的bit binary一样比 07/29 09:29
19F:→ VictorTom:不出来; 何不把您的用途/值域直接贴上来讨论算了~_~ 07/29 09:30
20F:→ ledia:== 也是在比 bit 呀 XD 07/29 10:40
21F:→ yk66:别想了,float.h里面有DBL_EPSILON,FLT_EPSILON等常数,请查阅 07/29 12:14