作者lairrol (趴趴藍)
看板C_and_CPP
標題Re: [問題] 兩種寫法的差異
時間Wed Jul 29 19:53:07 2009
原文吃光光留一點...
1.把原本的浮點數改成整數去做比較
2.把浮點數轉成字串去做比較
方法1的部份code:
...........
int a,b;
int c[i]
if(a = = b) c[i]=a;
...........
方法2的部份code:
...........
char str1[6],str2[6];
double s1,s2;
double c[i]
sprintf(str1,"%2.1f",s1);
sprintf(str2,"%2.1f",s2);
if( (strcmp(str1,str2)) = = 0 ) c[i]=s1;
...........
先把我的用途跟值域報告一下:
#include<stdio.h>
int main(
void)
{
double aa[60]={1.2,0.9,0.6,0.7,1.2,0.5,0.9,0.8,0.7,0.8,1.5,0.9,
1.6,0.8,0.8,1.9,1.2,0.6,0.8,0.7,0.5,1.5,0.6,1.6,
1.5,0.7,0.9,1.2,1,0.7,1.5,0.6,0.5,1.4,1.4,0.9,
0.7,0.7,0.9,1.2,0.8,0.7,1.3,0.5,1.4,0.5,0.9,1.7,
0.5,0.7,1.2,0.8,0.8,0.6,1.9,0.6,0.8,1.6,1,0.7};
double bb[12]={0.6,0.7,1.8,0.9,0.5,1.6,0.9,1.5,1.8,0.8,0.9,0.5};
double cc[30]={0.5,1,0.8,1.5,1.6,1.5,0.8,1.6,0.8,1.6,0.9,1.7,
0.8,1.7,1,0.8,0.9,1.8,0.5,1.5,1,0.9,0.8,0.9,1.5,
1.8,0.7,0.8,1.6,0.6};
double dd[12]={1.6,0.6,0.7,1,0.9,1.6,1,0.8,0.8,0.9,0.6,0.6};
int a,b,c,d,count=0;
double w=0;
for(a=0;a<60;a++)
{
for(b=0;b<12;b++)
{
if(b%2==0)
{
for(c=0;c<29;c++)
{
for(d=0;d<12;d++)
{
w=aa[a]+bb[b]+cc[c]+dd[d];
//printf("%2.1f\n",w);
count++;
}
}
}
else
{
for(c=0;c<30;c++)
{
for(d=0;d<12;d++)
{
w=aa[a]+bb[b]+cc[c]+dd[d];
//printf("%2.1f\n",w);
count++;
}
}
}
}
}
printf("count=%d\n",count);
return 0;
}
程式的用途就是要把aa[] bb[] cc[] dd[]四組陣列內的數字相加
然後把這些相加後的值存起來做後續的使用(搜尋某些值、計算某些值出現的次數‧‧‧)
四組陣列裡面所存放的值大約都是0.5~1.9的浮點數
相加出來所要處理的值大概是介於2.1~7.2之間的浮點數
================================我是分隔線==================================
我新的想法:
可以的話把我要處理的浮點數用2進位的表示去互相比較
ex:
10進位=> 1.5
2進位=> 1.1
可不可以用兩組陣列來存放整數部份的2進位碼跟小數部份的2進位碼
像是這樣
1.5可以存成↓
整數部份:
┌─┬─┬─┬─┐
i_bit[4] │ 0│ 0│ 0│ 1│
└─┴─┴─┴─┘
小數部份:
┌─┬─┬─┬─┐
f_bit[4] │ 1│ 0│ 0│ 0│
└─┴─┴─┴─┘
然後就可以把要比較的兩個浮點數一個一個bit去比....
我的意思大概是這樣!!
想了很久不知道這樣可不可行....
--
態度決定你的
高度
你有多
高?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.114.166.192
→ MOONRAKER:想太多,轉換的時間就不知道花多少 07/29 21:03
→ james732:其實我建議別用"想"的 寫寫看就知道了 動手吧! 07/29 21:04
→ su31o4gj83:作法看起來蠻簡單的, 我沒去試, 但應該是可以用 07/29 21:12
→ su31o4gj83:其實用 abs(兩數相減) < EPSILON 就好了, 別想太多 07/29 21:14
→ su31o4gj83: f 07/29 21:16
推 ledia:那為什麼不直接用 float 比就好 囧 07/29 21:31
→ ledia:兩種比法是一樣的呀 07/29 21:31
推 cismjmgoshr:全部乘10就會變整數了 浮點數運算可能有誤差,整數沒有 07/29 22:35
推 VictorTom:其實值域才這樣, 用傳統的EPSILON法比較就夠了.... 07/29 23:08
→ VictorTom:還有我已經推過了, 你2.1f%用char[4]應該不夠放.... 07/29 23:09
→ VictorTom:另外, 乘以10看rounding的方法, 還是會有誤差的.... 07/29 23:09
→ VictorTom:但是一開始就直接使用乘以10好的int data倒是OK的.... 07/29 23:09
→ VictorTom:而且全部int的計算轉換與計算時間就都還算ok了.... 07/29 23:11
※ 編輯: lairrol 來自: 58.114.166.192 (07/30 06:02)
→ lairrol:請問一下S大 EPSILON是什麼意思? 07/30 06:04
→ lairrol:to V大:我要比較的數大概是X.X這樣類型的浮點數,為什麼 07/30 06:07
→ lairrol:會不夠放阿? 07/30 06:07
→ akasan:\0也要空間阿 07/30 07:08
→ lairrol:數字 1=> 存放在char[] 裡面佔用1個位置 07/30 08:08
→ lairrol:英文字 a or A 在char[]裡面佔1個位置 07/30 08:08
→ lairrol:"\0"在char[] 內是佔1個位置? 以上是我的認知請問正確嗎? 07/30 08:09
→ lairrol:p.s:中文字 一個字佔char[] 2個位置.... 07/30 08:10
推 VictorTom:對不起~~我解錯對齊位了, %2.1f用char [4]就夠放了Orz 07/30 09:07
→ VictorTom:每次看到浮點對齊位都很容易搞錯, 非常抱歉....<(_ _)> 07/30 09:08
→ VictorTom:話說回來, double 要用 %lf (是L不是數字) 印吧:) 07/30 09:10
推 VictorTom:EPSILON方法就是3F su大推的那個方法:) 07/30 09:15
→ su31o4gj83:EPSILON是希臘字母, 小寫的EPSILON在數學上常用來代表 07/30 09:40
→ su31o4gj83:一個很微小的數字, 而如何決定EPSILON, 可參考a大的 07/30 09:42
→ su31o4gj83:#1AO_CbEU, 基本上定個 0.00000001 就很夠用了 07/30 09:47
→ lairrol:嗯我了解了!!謝謝各位的解答~我再去試試看!! 07/30 09:48
推 VictorTom:剛重頭看了一下, 如果要存起來後續要搜尋等使用的話.... 07/30 10:06
→ VictorTom:這樣的值域與用途滿適合直接x10整數化然後存起來的.... 07/30 10:06
→ VictorTom:開個int [100]就可以全部存起來, search也很快吧XD 07/30 10:07