Re: [問題] Floor[2.] = 1 的錯誤

看板Mathematica作者 (養花種魚數月亮賞星星)時間12年前 (2012/07/07 19:51), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《jurian0101 (Hysterisis)》之銘言: : 如題 : 我寫了一個函數s 希望能讓s[n] 輸出所有 n->xy並排 | n=x*y, x≦y : 例如 s[16] = {16->116, 16->28, 16-> 44} : 寫成這樣 : s[n_] := s[n] = (n -> # &) /@ : Cases[ : (Cases[ : MapThread[List,{Divisors[n], n/Divisors[n]}],{x_, _} /; x<=N[Sqrt[n]]] : ) /. {a_Integer, b_Integer} -> a*10^Floor[Log[b]/Log[10] + 1]] + b : , c_Integer /; c <= 10000] : 10000是原題的限制先不管他 : 總之這樣寫一經測試出現了不可能的結果 : 例如 s[9100]= {9100->9200} : Trace後發現癥結出在上面標黃色的對數計算竟然造成了 : Log[10,100] = 0.434294 Log[100] = 2. : Floor[2.] = 1 (!!!) 的結果 : 後來解決辦法也很傻眼,把黃色加一個點變成 : Floor[Log[b]/Log[10] + 1.]] 問題就解決了 : 我對Mathematica數值計算的規則還不是很熟,想請問說 : 這裡是怎麼出錯的 (Precision之類的???),不然以後再遇到這類的數值計算準又頭大了 In[1]:= $Version Out[1]= "8.0 for Mac OS X x86 (64-bit) (October 5, 2011)" In[2]:= $MaxExtraPrecision Out[2]= 50. In[3]:= Floor[2.] == 1 Out[3]= False In[4]:= s[n_] := s[n] = Map[n -> # &, Select[#[[2]] + #[[1]]*10^Floor[N[Log[#[[2]]]/Log[10] + 1]] & /@ Cases[Transpose@{Divisors[n], n/Divisors[n]}, {x_, _} /; x <= N@Sqrt[n]], # <= 10000 &] ] In[5]:= s[1000] Out[5]= {1000 -> 2000, 1000 -> 2500, 1000 -> 4250, 1000 -> 5200, 1000 -> 8125, 1000 -> 2050, 1000 -> 2540} N[Log[#[[2]]]/Log[10] + 1] 先轉成Mathematica可接受的精位數即可~ -- 養花種魚數月亮賞星星 http://chungyuandye.twbbs.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.131.69

07/10 22:58, , 1F
我版本是7.0,後來自己改用成功的方法是(很賊的)在
07/10 22:58, 1F

07/10 22:59, , 2F
Floor裡面隨便加了一個10^(-16)...完全胡來意味
07/10 22:59, 2F
文章代碼(AID): #1F-2AhbU (Mathematica)
討論串 (同標題文章)
文章代碼(AID): #1F-2AhbU (Mathematica)