Re: [問題] Floor[2.] = 1 的錯誤
看板Mathematica作者chungyuandye (養花種魚數月亮賞星星)時間12年前 (2012/07/07 19:51)推噓0(0推 0噓 2→)留言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
07/10 22:58, 1F
→
07/10 22:59, , 2F
07/10 22:59, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章