看板 C_and_CPP 關於我們 聯絡資訊
原文吃光光留一點... 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:http://tinyurl.com/ncsfhq 之前看到的網頁 07/29 21:11
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