Re: [問題] 兩種寫法的差異

看板C_and_CPP作者 (趴趴藍)時間15年前 (2009/07/29 19:53), 編輯推噓7(7026)
留言33則, 8人參與, 最新討論串2/2 (看更多)
原文吃光光留一點... 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

07/29 21:03, , 1F
想太多,轉換的時間就不知道花多少
07/29 21:03, 1F

07/29 21:04, , 2F
其實我建議別用"想"的 寫寫看就知道了 動手吧!
07/29 21:04, 2F

07/29 21:11, , 3F
http://tinyurl.com/ncsfhq 之前看到的網頁
07/29 21:11, 3F

07/29 21:12, , 4F
作法看起來蠻簡單的, 我沒去試, 但應該是可以用
07/29 21:12, 4F

07/29 21:14, , 5F
其實用 abs(兩數相減) < EPSILON 就好了, 別想太多
07/29 21:14, 5F

07/29 21:16, , 6F
f
07/29 21:16, 6F

07/29 21:31, , 7F
那為什麼不直接用 float 比就好 囧
07/29 21:31, 7F

07/29 21:31, , 8F
兩種比法是一樣的呀
07/29 21:31, 8F

07/29 22:35, , 9F
全部乘10就會變整數了 浮點數運算可能有誤差,整數沒有
07/29 22:35, 9F

07/29 23:08, , 10F
其實值域才這樣, 用傳統的EPSILON法比較就夠了....
07/29 23:08, 10F

07/29 23:09, , 11F
還有我已經推過了, 你2.1f%用char[4]應該不夠放....
07/29 23:09, 11F

07/29 23:09, , 12F
另外, 乘以10看rounding的方法, 還是會有誤差的....
07/29 23:09, 12F

07/29 23:09, , 13F
但是一開始就直接使用乘以10好的int data倒是OK的....
07/29 23:09, 13F

07/29 23:11, , 14F
而且全部int的計算轉換與計算時間就都還算ok了....
07/29 23:11, 14F
※ 編輯: lairrol 來自: 58.114.166.192 (07/30 06:02)

07/30 06:04, , 15F
請問一下S大 EPSILON是什麼意思?
07/30 06:04, 15F

07/30 06:07, , 16F
to V大:我要比較的數大概是X.X這樣類型的浮點數,為什麼
07/30 06:07, 16F

07/30 06:07, , 17F
會不夠放阿?
07/30 06:07, 17F

07/30 07:08, , 18F
\0也要空間阿
07/30 07:08, 18F

07/30 08:08, , 19F
數字 1=> 存放在char[] 裡面佔用1個位置
07/30 08:08, 19F

07/30 08:08, , 20F
英文字 a or A 在char[]裡面佔1個位置
07/30 08:08, 20F

07/30 08:09, , 21F
"\0"在char[] 內是佔1個位置? 以上是我的認知請問正確嗎?
07/30 08:09, 21F

07/30 08:10, , 22F
p.s:中文字 一個字佔char[] 2個位置....
07/30 08:10, 22F

07/30 09:07, , 23F
對不起~~我解錯對齊位了, %2.1f用char [4]就夠放了Orz
07/30 09:07, 23F

07/30 09:08, , 24F
每次看到浮點對齊位都很容易搞錯, 非常抱歉....<(_ _)>
07/30 09:08, 24F

07/30 09:10, , 25F
話說回來, double 要用 %lf (是L不是數字) 印吧:)
07/30 09:10, 25F

07/30 09:15, , 26F
EPSILON方法就是3F su大推的那個方法:)
07/30 09:15, 26F

07/30 09:40, , 27F
EPSILON是希臘字母, 小寫的EPSILON在數學上常用來代表
07/30 09:40, 27F

07/30 09:42, , 28F
一個很微小的數字, 而如何決定EPSILON, 可參考a大的
07/30 09:42, 28F

07/30 09:47, , 29F
#1AO_CbEU, 基本上定個 0.00000001 就很夠用了
07/30 09:47, 29F

07/30 09:48, , 30F
嗯我了解了!!謝謝各位的解答~我再去試試看!!
07/30 09:48, 30F

07/30 10:06, , 31F
剛重頭看了一下, 如果要存起來後續要搜尋等使用的話....
07/30 10:06, 31F

07/30 10:06, , 32F
這樣的值域與用途滿適合直接x10整數化然後存起來的....
07/30 10:06, 32F

07/30 10:07, , 33F
開個int [100]就可以全部存起來, search也很快吧XD
07/30 10:07, 33F
文章代碼(AID): #1AS3Wc3t (C_and_CPP)
文章代碼(AID): #1AS3Wc3t (C_and_CPP)