Re: appending '.' in CForm
- To: mathgroup at smc.vnet.net
- Subject: [mg55453] Re: appending '.' in CForm
- From: Peter Pein <petsie at arcor.de>
- Date: Thu, 24 Mar 2005 03:41:52 -0500 (EST)
- References: <d1rgua$42h$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Matt Flax wrote: > Hello, > > I have an equation which symbolicly evals. to a 1 MB file when streamed > to file using CForm ... it is a very very long equation ! > > I am unsatisfied with the results of CForm, because it writes longs, > rather then writing doubles out ... for example : > 314572800*Power(b,2)*Power(d,4)*dr*e*Power(f,6)*Power(t,10)* > instead of : > 314572800.0*Power(b,2)*Power(d,4)*dr*e*Power(f,6)*Power(t,10)* > > The issue is that the integer aproaches the limit of max. int. which is > listed in values.h (GNU compiler). > > So ... how would I force CForm to print out integers as doubles ? > > thanks > Matt Hi Matt, if you've got a polynomial equaltion, the following should work: int2double[expr_] := expr //. (f:Plus | Times)[a___, i_Integer, b___] :> f[a, N[i, Ceiling[Log[10, Abs[i]]]], b] let's try it: test = Sum[(-1)^Random[Integer]*Random[Integer, {10^10, 10^12}]*x^j, {j, -1, 2}] ==> -989314302571 - 259078934146/x + 755768626052*x + 10188600055*x^2 CForm[int2double[test]] ==> -9.89314302571e11 - 2.59078934146e11/x + 7.55768626052e11*x + 1.0188600055e10*Power(x,2) seems OK. -- Peter Pein Berlin