Anzeige:
Ergebnis 1 bis 4 von 4

Thema: C: Define or not to Define

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.02.2006
    Beiträge
    41

    C: Define or not to Define

    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:
    Code:
     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

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Also entweder per #define oder aber mit const double. Wenn das Attribut double wichtig ist, würde ich die Variante
    Code:
    const double PI = 3.14159E+00;
    verwenden, ansonsten eher die Variante
    Code:
    #define PI 3.14159E+00
    .

    Ist aber mehr persönlicher Geschmack.

    HTH jeebee
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.02.2006
    Beiträge
    41
    Vielen Dank für die Infos.
    Besten Dank!

    Andi

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •