請問Matlab如何計算大整數?比如 1000! ?
1.為什麼factorial(1000)顯示inf,怎麼這麼大的數就算不了么?
2.MATLAB如何處理大整數或浮點數的運算,有沒有成熟的方法?比如C介面或者toolbox之類?
@摘星子如果要在 MATLAB 裡邊算調用符號計算的話:
expand(factorial(sym(1000)))
不加 expand 會保留 1000! 的形式,但是不影響後續計算,畢竟 1000! 這個結果多數時候比一長串數字更有意義
另外可以在 MATLAB 中執行:mupad,打開 mupad 之後計算,寫起來會方便些
除此之外可以在 MATLAB 中調用 python (需要自己安裝 python),或者 java(MATLAB 內置),或者 C# (僅限 windows 平台),用這些語言的大整數計算如果是非整數的話,符號計算工具箱裡邊的 vpa,或者直接在 mupad 中算也有第三方的工具箱提供這種能力,例如:Multiprecision Computing Toolbox for MATLAB你想用 C 當然也可以,比方說你可以用 C 調用 The GNU MP Bignum Library 之後編譯為 mex 函數在 MATLAB 中調用這種事情還是交給專業的來好了
mathematica使用第三方工具包:Variable Precision Integer Arithmetic
Variable Precision Integer Arithmetic&>&> factorial(vpi(1000))
ans =
40238726007709377354370243392300398571937486421071463254379991042993
851239862902059204420848696940480047998861019719605863166687299480855890
132382966994459099742450408707375991882362772718873251977950595099527612
087497546249704360141827809464649629105639388743788648733711918104582578
364784997701247663288983595573543251318532395846307555740911426241747434
934755342864657661166779739666882029120737914385371958824980812686783837
455973174613608537953452422158659320192809087829730843139284440328123155
861103697680135730421616874760967587134831202547858932076716913244842623
613141250878020800026168315102734182797770478463586817016436502415369139
828126481021309276124489635992870511496497541990934222156683257208082133
318611681155361583654698404670897560290095053761647584772842188967964624
494516076535340819890138544248798495995331910172335555660213945039973628
075013783761530712776192684903435262520001588853514733161170210396817592
151090778801939317811419454525722386554146106289218796022383897147608850
627686296714667469756291123408243920816015378088989396451826324367161676
217916890977991190375403127462228998800519544441428201218736174599264295
658174662830295557029902432415318161721046583203678690611726015878352075
151628422554026517048330422614397428693306169089796848259012545832716822
645806652676995865268227280707578139185817888965220816434834482599326604
336766017699961283186078838615027946595513115655203609398818061213855860
030143569452722420634463179746059468257310379008402443243846565724501440
282188525247093519062092902313649327349756551395872055965422874977401141
334696271542284586237738753823048386568897646192738381490014076731044664
025989949022222176590433990188601856652648506179970235619389701786004081
188972991831102117122984590164192106888438712185564612496079872290851929
681937238864261483965738229112312502418664935314397013742853192664987533
721894069428143411852015801412334482801505139969429015348307764456909907
315243327828826986460278986432113908350621709500259738986355427719674282
224875758676575234422020757363056949882508796892816275384886339690995982
628095612145099487170124451646126037902930912088908694202851064018215439
945715680594187274899809425474217358240106367740459574178516082923013535
808184009699637252423056085590370062427124341690900415369010593398383577
793941097002775347200000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000
真巧,今天在學習Mathematics的時候碰到過這個問題,Mathematics計算階乘超級快,樓主可以試試。 Matlab中的數一律用雙精度格式存儲,其範圍一般而言已經足夠了,但也有例外的時候,比如說計算200以上大數的階乘。 Mathematics擅長符號計算,Matlab擅長數值計算。下面給出Matlab計算階乘的幾個方法:1: factorial( )函數
&>&>
factorial(4)
ans
= 24
4!=4*3*2*1=24
2:借用Gamma函數的性質,當n為正整數時,gamma(n+1)=n!
&>&>
gamma(5)
ans
= 24
gamma(N)=(N-1)*(N-2)*...*2*1
3:prod( )函數 prod函數用於求數組元素的乘積
&>&> A=1:1:100;
&>&> prod(A)
ans = 9.3326e+157還可以用它求雙階乘:
&>&> prod(1:2:7)
ans = 1054.編寫M文件也是可以的...
BUT,以上方法只適合小數階乘,碰到大數階乘就inf歇菜了...So,Matlab裡面有個Maple引擎用來符號計算的,可以借用符號計算實現大數階乘:
&>&>
s="4!"
s =4!
&>&>
vpa(s)
ans =24.
&>&> factorial(365)
ans =Inf
&>&> simple(sym("365!"))simplify:25104128675558732292929443748812027705165520269876079766872595193901106138220937419666018009000254169376172314360982328660708071123369979853445367910653872383599704355532740937678091491429440864316046925074510134847025546014098005907965541041195496105311886173373435145517193282760847755882291690213539123479186274701519396808504940722607033001246328398800550487427999876690416973437861078185344667966871511049653888130136836199010529180056125844549488648617682915826347564148990984138067809999604687488146734837340699359838791124995957584538873616661533093253551256845056046388738129702951381151861413688922986510005440943943014699244112555755279140760492764253740250410391056421979003289600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000這裡省略了一部分輸出..
simple( )這種表現形式很不好,改用極限的形式試一下:
&>&> syms x;
&>&> limit("x+365!",x,0)ans =25104128675558732292929443748812027705165520269876079766872595193901106138220937419666018009000254169376172314360982328660708071123369979853445367910653872383599704355532740937678091491429440864316046925074510134847025546014098005907965541041195496105311886173373435145517193282760847755882291690213539123479186274701519396808504940722607033001246328398800550487427999876690416973437861078185344667966871511049653888130136836199010529180056125844549488648617682915826347564148990984138067809999604687488146734837340699359838791124995957584538873616661533093253551256845056046388738129702951381151861413688922986510005440943943014699244112555755279140760492764253740250410391056421979003289600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&>&> whos
Name Size Bytes Class Attributesans 1x1 1682 sym x 1x1 126 sym 可以看出,這裡ans是一個sym型值,且並不能轉換為double值:&>&> str2double(ans)ans =NaN還是藉助Maple引擎計算,這麼表示也可以:
&>&> s="365!";&>&> vpa(s)ans =2.5104128675558732292929443748812*10^778&>&> str2double(ans)
ans =NaN以上三種表示方式核心都是借用Maple引擎計算求解,但是這裡ans是一個sym型值,且並不能轉換為double值
所以,廢話幾句:其實Mathematica在這方面NB多了,又快又精確:
就一行語句:
factorial(sym(1000))
但是失敗了
高精度計算MATLAB真的也可以!只需要使用符號計算功能即可。
本人在MATLAB 2012b和2015b上調試通過。
syms n
n=sym(1:1000);
prod(n)
結果如下:
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
推薦閱讀:
※為什麼招程序員不考慮MATLAB技能?
※各位大神,請問如何用matlab證明人耳對聲音的相位不敏感?
※請通俗易懂地解釋一下guidata()的用法?以及他是如何幫助參數在GUI間傳遞的?
※Matlab畫圖增加右邊坐標軸的刻度,與左邊一樣,如何處理?
※請問怎麼用matlab 畫一個傾斜的橢球?
TAG:MATLAB |