Help on compiling a function
- To: mathgroup at smc.vnet.net
- Subject: [mg115614] Help on compiling a function
- From: Ramiro <ramiro.barrantes at gmail.com>
- Date: Sun, 16 Jan 2011 05:54:33 -0500 (EST)
Hi everyone, I had written about this but wanted to revisit the problem in light of the latest Mathematica options for compiling (C and parallelization), which I was hoping to try to use on this function, which is the main arithmetic and time-consuming part of my simulation. I have the following code: example1 = Compile[{{n, _Real, 1}, {a, _Real}, {b, _Real}, {t, _Real, 1}}, Gamma[Total[n] + a]/(Times @@ (Gamma[n + 1])*Gamma[a])*b^a* Times @@ (t^n)/(Total[t] + b)^(Total[n] + a)]; but under input such as the following it breaks: example1[{97.6203, 8.4788, 21.4204, 46.1755}, 1, 1, {39.9342, 7.5820, 5.8656, 10.0553}] CompiledFunction::cfse: Compiled expression 1.33128164105722332870399207`12.920368310128136*^315 should be a machine-size real number. >> CompiledFunction::cfex: Could not complete external evaluation at instruction 4; proceeding with uncompiled evaluation. >> the problem is just that in the calculation Gamma ends up being really big, larger than $MaxMachineNumber so it complains. Anybody see a way around this? This is the workhorse function of my simulation, so any gain in speed helps a lot Thanks in advance, Ramiro Longer explanation (if interested): example = Compile[{{n, _Real, 1}, {a, _Real}, {b, _Real}, {t, _Real, 1}}, Module[{totaln, totalt, gammanp1times, tpowntimes, times1, div1, times2, times3, pow1, gammatotnpa}, totaln = Total[n]; totalt = Total[t]; gammanp1times = Apply[Times, Gamma[n + 1]]; tpowntimes = Apply[Times, t^n]; times1 = Times[gammanp1times, Gamma[a]]; gammatotnpa = Gamma[totaln + a]; div1 = Divide[gammatotnpa, times1]; times2 = Times[div1, b^a]; times3 = Times[times2, tpowntimes]; pow1 = Power[totalt + b, totaln + a]; Divide[times3, pow1]] ] example[{97.6203, 8.4788, 21.4204, 46.1755}, 1, 1, {39.9342, 7.5820, 5.8656, 10.0553}] the result of gammatotnpa is greater than 10^315 which is greater than $MaxMachineNumber on my machine. Any suggestions?