[問題] Floor[2.] = 1 的錯誤
如題
我寫了一個函數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
07/12 09:35, 1F
→
07/12 09:35, , 2F
07/12 09:35, 2F
→
07/14 18:04, , 3F
07/14 18:04, 3F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章