PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Define or not to Define



Andi_Rostock
03-12-2008, 20:34
Hallo zusammen,

ich habe doch vor ein paar Wochen geschrieben, dass ich einen ODE-Löser von Fortran nach C protieren möchte...

Für die Lösung der DGL wird eine Reihe von Konstanten definiert. Nun stellt sich für mich die Frage was nun eigentlich besser ist. Hier sind die Faktoren definiert:


double c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c14, c15, c16;
double b1, b6, b7, b8, b9, b10, b11, b12, bhh1, bhh2, bhh3;
double er1, er6, er7, er8, er9, er10, er11, er12;
double a21, a31, a32, a41, a43, a51, a53, a54, a61, a64, a65, a71, a74, a75, a76;
double a81, a84, a85, a86, a87, a91, a94, a95, a96, a97, a98;
double a101, a104, a105, a106, a107, a108, a109;
double a111, a114, a115, a116, a117, a118, a119, a1110;
double a121, a124, a125, a126, a127, a128, a129, a1210, a1211;
double a141, a147, a148, a149, a1410, a1411, a1412, a1413;
double a151, a156, a157, a158, a1511, a1512, a1513, a1514;
double a161, a166, a167, a168, a169, a1613, a1614, a1615;
double d41, d46, d47, d48, d49, d410, d411, d412, d413, d414, d415, d416;
double d51, d56, d57, d58, d59, d510, d511, d512, d513, d514, d515, d516;
double d61, d66, d67, d68, d69, d610, d611, d612, d613, d614, d615, d616;
double d71, d76, d77, d78, d79, d710, d711, d712, d713, d714, d715, d716;

/* initialisations */
c2 = 0.526001519587677318785587544488E-01;
c3 = 0.789002279381515978178381316732E-01;
c4 = 0.118350341907227396726757197510E+00;
c5 = 0.281649658092772603273242802490E+00;
c6 = 0.333333333333333333333333333333E+00;
c7 = 0.25E+00;
c8 = 0.307692307692307692307692307692E+00;
c9 = 0.651282051282051282051282051282E+00;
c10 = 0.6E+00;
c11 = 0.857142857142857142857142857142E+00;
c14 = 0.1E+00;
c15 = 0.2E+00;
c16 = 0.777777777777777777777777777778E+00;

b1 = 5.42937341165687622380535766363E-2;
b6 = 4.45031289275240888144113950566E0;
b7 = 1.89151789931450038304281599044E0;
b8 = -5.8012039600105847814672114227E0;
b9 = 3.1116436695781989440891606237E-1;
b10 = -1.52160949662516078556178806805E-1;
b11 = 2.01365400804030348374776537501E-1;
b12 = 4.47106157277725905176885569043E-2;

bhh1 = 0.244094488188976377952755905512E+00;
bhh2 = 0.733846688281611857341361741547E+00;
bhh3 = 0.220588235294117647058823529412E-01;

er1 = 0.1312004499419488073250102996E-01;
er6 = -0.1225156446376204440720569753E+01;
er7 = -0.4957589496572501915214079952E+00;
er8 = 0.1664377182454986536961530415E+01;
er9 = -0.3503288487499736816886487290E+00;
er10 = 0.3341791187130174790297318841E+00;
er11 = 0.8192320648511571246570742613E-01;
er12 = -0.2235530786388629525884427845E-01;

a21 = 5.26001519587677318785587544488E-2;
a31 = 1.97250569845378994544595329183E-2;
a32 = 5.91751709536136983633785987549E-2;
a41 = 2.95875854768068491816892993775E-2;
a43 = 8.87627564304205475450678981324E-2;
a51 = 2.41365134159266685502369798665E-1;
a53 = -8.84549479328286085344864962717E-1;
a54 = 9.24834003261792003115737966543E-1;
a61 = 3.7037037037037037037037037037E-2;
a64 = 1.70828608729473871279604482173E-1;
a65 = 1.25467687566822425016691814123E-1;
a71 = 3.7109375E-2;
a74 = 1.70252211019544039314978060272E-1;
a75 = 6.02165389804559606850219397283E-2;
a76 = -1.7578125E-2;

a81 = 3.70920001185047927108779319836E-2;
a84 = 1.70383925712239993810214054705E-1;
a85 = 1.07262030446373284651809199168E-1;
a86 = -1.53194377486244017527936158236E-2;
a87 = 8.27378916381402288758473766002E-3;
a91 = 6.24110958716075717114429577812E-1;
a94 = -3.36089262944694129406857109825E0;
a95 = -8.68219346841726006818189891453E-1;
a96 = 2.75920996994467083049415600797E1;
a97 = 2.01540675504778934086186788979E1;
a98 = -4.34898841810699588477366255144E1;
a101 = 4.77662536438264365890433908527E-1;
a104 = -2.48811461997166764192642586468E0;
a105 = -5.90290826836842996371446475743E-1;
a106 = 2.12300514481811942347288949897E1;
a107 = 1.52792336328824235832596922938E1;
a108 = -3.32882109689848629194453265587E1;
a109 = -2.03312017085086261358222928593E-2;

a111 = -9.3714243008598732571704021658E-1;
a114 = 5.18637242884406370830023853209E0;
a115 = 1.09143734899672957818500254654E0;
a116 = -8.14978701074692612513997267357E0;
a117 = -1.85200656599969598641566180701E1;
a118 = 2.27394870993505042818970056734E1;
a119 = 2.49360555267965238987089396762E0;
a1110 = -3.0467644718982195003823669022E0;
a121 = 2.27331014751653820792359768449E0;
a124 = -1.05344954667372501984066689879E1;
a125 = -2.00087205822486249909675718444E0;
a126 = -1.79589318631187989172765950534E1;
a127 = 2.79488845294199600508499808837E1;
a128 = -2.85899827713502369474065508674E0;
a129 = -8.87285693353062954433549289258E0;
a1210 = 1.23605671757943030647266201528E1;
a1211 = 6.43392746015763530355970484046E-1;

a141 = 5.61675022830479523392909219681E-2;
a147 = 2.53500210216624811088794765333E-1;
a148 = -2.46239037470802489917441475441E-1;
a149 = -1.24191423263816360469010140626E-1;
a1410 = 1.5329179827876569731206322685E-1;
a1411 = 8.20105229563468988491666602057E-3;
a1412 = 7.56789766054569976138603589584E-3;
a1413 = -8.298E-3;

a151 = 3.18346481635021405060768473261E-2;
a156 = 2.83009096723667755288322961402E-2;
a157 = 5.35419883074385676223797384372E-2;
a158 = -5.49237485713909884646569340306E-2;
a1511 = -1.08347328697249322858509316994E-4;
a1512 = 3.82571090835658412954920192323E-4;
a1513 = -3.40465008687404560802977114492E-4;
a1514 = 1.41312443674632500278074618366E-1;
a161 = -4.28896301583791923408573538692E-1;
a166 = -4.69762141536116384314449447206E0;
a167 = 7.68342119606259904184240953878E0;
a168 = 4.06898981839711007970213554331E0;
a169 = 3.56727187455281109270669543021E-1;
a1613 = -1.39902416515901462129418009734E-3;
a1614 = 2.9475147891527723389556272149E0;
a1615 = -9.15095847217987001081870187138E0;

d41 = -0.84289382761090128651353491142E+01;
d46 = 0.56671495351937776962531783590E+00;
d47 = -0.30689499459498916912797304727E+01;
d48 = 0.23846676565120698287728149680E+01;
d49 = 0.21170345824450282767155149946E+01;
d410 = -0.87139158377797299206789907490E+00;
d411 = 0.22404374302607882758541771650E+01;
d412 = 0.63157877876946881815570249290E+00;
d413 = -0.88990336451333310820698117400E-01;
d414 = 0.18148505520854727256656404962E+02;
d415 = -0.91946323924783554000451984436E+01;
d416 = -0.44360363875948939664310572000E+01;

d51 = 0.10427508642579134603413151009E+02;
d56 = 0.24228349177525818288430175319E+03;
d57 = 0.16520045171727028198505394887E+03;
d58 = -0.37454675472269020279518312152E+03;
d59 = -0.22113666853125306036270938578E+02;
d510 = 0.77334326684722638389603898808E+01;
d511 = -0.30674084731089398182061213626E+02;
d512 = -0.93321305264302278729567221706E+01;
d513 = 0.15697238121770843886131091075E+02;
d514 = -0.31139403219565177677282850411E+02;
d515 = -0.93529243588444783865713862664E+01;
d516 = 0.35816841486394083752465898540E+02;

d61 = 0.19985053242002433820987653617E+02;
d66 = -0.38703730874935176555105901742E+03;
d67 = -0.18917813819516756882830838328E+03;
d68 = 0.52780815920542364900561016686E+03;
d69 = -0.11573902539959630126141871134E+02;
d610 = 0.68812326946963000169666922661E+01;
d611 = -0.10006050966910838403183860980E+01;
d612 = 0.77771377980534432092869265740E+00;
d613 = -0.27782057523535084065932004339E+01;
d614 = -0.60196695231264120758267380846E+02;
d615 = 0.84320405506677161018159903784E+02;
d616 = 0.11992291136182789328035130030E+02;

d71 = -0.25693933462703749003312586129E+02;
d76 = -0.15418974869023643374053993627E+03;
d77 = -0.23152937917604549567536039109E+03;
d78 = 0.35763911791061412378285349910E+03;
d79 = 0.93405324183624310003907691704E+02;
d710 = -0.37458323136451633156875139351E+02;
d711 = 0.10409964950896230045147246184E+03;
d712 = 0.29840293426660503123344363579E+02;
d713 = -0.43533456590011143754432175058E+02;
d714 = 0.96324553959188282948394950600E+02;
d715 = -0.39177261675615439165231486172E+02;
d716 = -0.14972683625798562581422125276E+03;


So nun kann man das wir im Beispiel definieren oder ich definiere die per #define. Bringt das was? Bzw. wann macht es eher Sinn Konstanten als double zu definieren oder per #define?

Viele Grüße
Andi

jeebee
03-12-2008, 20:40
Also entweder per #define oder aber mit const double. Wenn das Attribut double wichtig ist, würde ich die Variante
const double PI = 3.14159E+00; verwenden, ansonsten eher die Variante
#define PI 3.14159E+00.

Ist aber mehr persönlicher Geschmack.

HTH jeebee

peschmae
04-12-2008, 04:53
Ich würde die Variablen auf jeden Fall als const double definieren.

Drei Gründe:
- ein #define ist global; das willst du in dem Falle aber nicht
- ein const double bietet Typsicherheit, im Gegensatz zu #defines
- Präprozessormakros im allgemeinen haben die Angewohnheit zu merkwürdigen Bugs zu führen die schwer zu durchschauen sind (siehe z.B. http://c-faq.com/cpp/safemacros.html); zugegebenermassen trifft das so weniger auf einfache Konstanten zu, aber imo ist es guter Stil Makros so wenig wie möglich (d.h. gar nicht) zu verwenden

Dagegen spricht nur, dass gemäss älteren C-Standards der Wert in den Speicher geladen wird, auch bei const double; wobei die paar Bytes in der Praxis komplett vernachlässigbar sind. Wenn dein Compiler C99 kann oder du gar einen C++ Compiler verwendest dann ist dem nicht mehr so.

Lange Erklärung: http://c-faq.com/cpp/constdefine2.html

MfG Peschmä

Andi_Rostock
04-12-2008, 19:28
Vielen Dank für die Infos.
Besten Dank!

Andi