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

看板Mathematica作者 (Hysterisis)時間12年前 (2012/07/07 00:12), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串1/2 (看更多)
如題 我寫了一個函數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之類的???),不然以後再遇到這類的數值計算準又頭大了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.236.119.215

07/12 09:35, , 1F
(我沒測試過) 將 Floor[Log[b]/Log[10] + 1] 改為
07/12 09:35, 1F

07/12 09:35, , 2F
IntegerLength[b] 或 Length[IntegerDigits[b]] 如何?
07/12 09:35, 2F

07/14 18:04, , 3F
謝謝
07/14 18:04, 3F
文章代碼(AID): #1Fzmw2lE (Mathematica)
討論串 (同標題文章)
文章代碼(AID): #1Fzmw2lE (Mathematica)