Re: c code generation
- To: mathgroup at smc.vnet.net
- Subject: [mg4408] Re: c code generation
- From: song at cs.purdue.edu (Chang-Hyeon Song)
- Date: Fri, 19 Jul 1996 04:26:50 -0400
- Organization: Purdue University
- Sender: owner-wri-mathgroup at wolfram.com
George Jefferson (george at mech.seas.upenn.edu) wrote: : :: The whole point of using a tool like Mathematica is to avoid writing C : :: code. If you must do that, I recommend a standard reference like : :: Numerical Recipies in C. In any event, Mathematica does not generate C : :: code for you. : : hardly the "whole point". Mathematica is a good tool for preparing : portions source code to send off to another application. : : :I am about to release automatic C program(code) generator from Mathematica : :language(McCogen). Maybe after my defense of MS thesis. : : have you looked at MathSource item # 0205-254 ? : : bugger if I can recall the name of the package at the moment...all : I have is that ref number. If you are refering to Sofronious' Mathematica package that extends builtin format rule, yes I know. It is even compared to McCogen in my thesis. McCogen can produce entire(whole) C program that can be compled with any ANSI C compiler with no modification at all. Generated C code includes easy-to-read indentation, header files, automatic declaration of all variables, dynamic allocation of memory, symbolically manipulated expressions. Here is some sample usage. In[28]:= M2C[ f[r_Integer] := -2000 r^2; g[x_Real] := Simplify[Integrate[Sin[x]+Cos[x],x] + Sum[1/x,{x,1,10}]]; x=1.0; a=Simplify[D[f[x],x] + D[g[x],x]] ] Out[28]= #include <math.h> /* Function prototypes */ int f( int ); double g( double ); /* Global variables */ double x, a; int f (int r) { return ((-2000 * pow(r,2)) ); } double g (double x) { return (((7381 / (double) 2520) + (-1 * cos(x)) + sin(x)) ); } int main() { x = 1.000000000000000; a = ((-4000 * x) + cos(x) + sin(x)); } ------------------------------------------------------ And here's Newton's method In[1]:= M2C[ bPrime[r_Double] := -2000/r^2 + 4 Pi r; FSIZE = 0.00001; x = 4.0; While [ Abs[bPrime[x]//N] >= FSIZE, x = N[x - bPrime[x] / bPrime'[x]]; Print["r = ", x, " bPrime = ", bPrime[x]//N] ]; Print["The root of bPrime is r = ", x] ] Out[1]:= #include <math.h> #include <stdio.h> /* Function prototypes */ double bPrime( double ); /* Global variables */ double FSIZE, x; double bPrime (double r) { return (((-2000 / pow(r,2)) + (4 * M_PI * r)) ); } int main() { FSIZE = 0.000010000000000; x = 4.000000000000000; while(fabs(bPrime(x)) >= FSIZE) { x = (x + (-1 * bPrime(x) / ((4 * M_PI) + (4000 * pow(x,-3))))); printf("r = %f bPrime = %f\n", x, bPrime(x)); } printf("The root of bPrime is r = %f\n", x); } --- Chang Song (song at cs.purdue.edu) ==== [MESSAGE SEPARATOR] ====