<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Jsem si říkal, proč má ten týpek na gitu hromady závorek, tak díky
    za vysvětlení.<br>
    <br>
    Nejvíc se mi samozřejmě líbí varianta s forem.<br>
    <br>
    Pak je ještě otázka, zda je nějaká optimalizace na to, když přibudou
    ještě ty další věci:<br>
    <img src="cid:part1.W9TOFvUq.Of0b2bOv@seznam.cz" alt=""><br>
    <a class="moz-txt-link-freetext" href="https://www.omega.co.uk/temperature/z/pdf/z198-201.pdf">https://www.omega.co.uk/temperature/z/pdf/z198-201.pdf</a><br>
    <br>
    A vlastně proč je to takhle a není prostě jen jiná sada koeficientů
    polynomu tak, aby se docílilo stejného tvaru funkce?<br>
    <br>
    PH<br>
    <br>
    <div class="moz-cite-prefix">Dne 25.12.2024 v 11:34 Miroslav Mraz
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:75b017f9-8e9a-4da6-b3c2-5c03d345c800@volny.cz">Koukal
      jsem na to a trochu si hrál s překladačem a jak definovat
      polynomy. Zkusil jsem 3 způsoby
      <br>
      <br>
      static constexpr int coeff [] = {1,2,3,4,5};
      <br>
      // default optimize -Os
      <br>
      int poly_a (const int x) {
      <br>
        int y = coeff[4];
      <br>
        int t = x;
      <br>
        y += coeff[3] * t;  t *= x;
      <br>
        y += coeff[2] * t;  t *= x;
      <br>
        y += coeff[1] * t;  t *= x;
      <br>
        y += coeff[0] * t;
      <br>
        return y;
      <br>
      }
      <br>
      int poly_b (const int x) {
      <br>
        return  ((((coeff[0]  * x)
      <br>
                  + coeff[1]) * x
      <br>
                  + coeff[2]) * x
      <br>
                  + coeff[3]) * x
      <br>
                  + coeff[4];
      <br>
      }
      <br>
      [[using gnu: optimize("O3")]] // unroll loop
      <br>
      int poly_c (const int x) {
      <br>
        int y = 0;
      <br>
        for (auto c : coeff) { y *= x; y += c; }
      <br>
        return y;
      <br>
      }
      <br>
      <br>
      Způsob a) je podobný kódu, co poslal balu, odděleně počítá mocninu
      argumentu, což není příliš efektivní. Způsob b) vyplyne z toho,
      pokud polynom napíšeme podle definice a uvědomíme si, že x je z
      toho možné povytýkat, ozávovorkovat to a je to jednodušší. A
      nakonec způsob c) jednoduchou smyčkou umožní to celé napsat
      jednodušeji.
      <br>
      <br>
      Ale proč to píšu. Uvědomil jsem si jak chytré jsou moderní
      překladače. Když donutím překladač, aby smyčku rozvinul, výsledný
      kód pro b) a c) jsou (pro RISC-V, ale zřejmě i jinde) naprosto
      stejné. Překladač pozná, že první násobení 0 je zbytečné a vyhodí
      ho. A nejen to - pozná i zbytečnost násobení 1 (1. koeficient, je
      konstatní), neprovádí ho.
      <br>
      <br>
      Mrazík
      <br>
      <br>
      On 24. 12. 24 16:13, Daniel Valuch wrote:
      <br>
      <blockquote type="cite">poslane sukromne...
        <br>
        <br>
        Ano, ja som to tiez minuly rok studoval spracovanie signalov od
        RTD a termoclankov cele vianoce. Zaujimava problematika.
        Dokumenty priamo z BIPM na temu ITS-90 a tabulky koeficientov
        pre RTD aj termoclanky od NISTu su velmi dobry zaklad a su velmi
        informativne.
        <br>
        <br>
        Prikladam vycuc z kodu
        <br>
        <br>
           if (MeasureTC1) {
        <br>
               // measure cold junction temperature first
        <br>
               RColdJunction = (float)ADCavrgCJ / (float)ADCavrgRef *
        R0; // scaling of cold junction and reference cancels out
        <br>
               TemperatureCJ =
        RTDpolynomial(WCorrection(RColdJunction/R0nominal)); //
        calculate cold junction temperature
        <br>
        <br>
               VCJ = ThermoCoupleK_TtoE(TemperatureCJ - 273.16); //
        equivalent Cold Junction voltage
        <br>
               VTC1raw = (float)ADCavrgTC1 * QueueBitShift * LSBmV *
        TC1InvGain;  // convert measured ADC number to voltage in mV
        <br>
               VTC1raw = VTC1raw -
        TC1offsetVoltage;                              // suppress
        analogue offset (e.g. from the op-amp)
        <br>
               VTC1comp = VTC1raw +
        VCJ;                                          // cold junction
        voltage added to measured voltage
        <br>
               TemperatureTC1 = ThermoCoupleK_EtoT(VTC1comp);
        <br>
               // 0=Celsius, 1=Kelvin, 2=Farenheit, 3=Ohm, 4=microVolt
        <br>
               if (unit == 0) {
        <br>
                 PrepareText(TemperatureTC1, 0);
        <br>
               } else if (unit == 1) {
        <br>
                 PrepareText(TemperatureTC1 + 273.15, 1);
        <br>
               } else if (unit == 2) {
        <br>
                 PrepareText(TemperatureTC1 * 1.8 + 32.0, 2);
        <br>
               } else if (unit == 3) {
        <br>
                 PrepareText(VTC1raw, 4);
        <br>
               }
        <br>
             }
        <br>
        <br>
        <br>
        float ThermoCoupleK_EtoT(float e) {
        <br>
           // type K ITS-90 polynomial
        <br>
           //
        <a class="moz-txt-link-freetext" href="https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html">https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html</a>
        <br>
           const float d0m = 0.0e0;
        <br>
           const float d1m = 2.5173462e1;
        <br>
           const float d2m = -1.1662878e0;
        <br>
           const float d3m = -1.0833638e0;
        <br>
           const float d4m = -8.9773540e-1;
        <br>
           const float d5m = -3.7342377e-1;
        <br>
           const float d6m = -8.6632643e-2;
        <br>
           const float d7m = -1.0450598e-2;
        <br>
           const float d8m = -5.1920577e-4;
        <br>
        <br>
           const float d0p = 0.000000e0;
        <br>
           const float d1p = 2.508355e1;
        <br>
           const float d2p = 7.860106e-2;
        <br>
           const float d3p = -2.503131e-1;
        <br>
           const float d4p = 8.315270e-2;
        <br>
           const float d5p = -1.228034e-2;
        <br>
           const float d6p = 9.804036e-4;
        <br>
           const float d7p = -4.413030e-5;
        <br>
           const float d8p = 1.057734e-6;
        <br>
           const float d9p = -1.052755e-8;
        <br>
        <br>
           float E = 0.0;
        <br>
           float t90 = 0.0;
        <br>
        <br>
           E = e;
        <br>
        <br>
           if (e < 0.00) {  // negative temperature
        <br>
             t90 = t90 + d1m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d2m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d3m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d4m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d5m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d6m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d7m * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d8m * E;
        <br>
           } else if (e >= 0 && e < 20.644) {  // positive
        temperature <500 C
        <br>
             t90 = t90 + d1p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d2p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d3p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d4p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d5p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d6p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d7p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d8p * E;
        <br>
             E = E * e;
        <br>
             t90 = t90 + d9p * E;
        <br>
           } else {
        <br>
             t90 = -273.0;
        <br>
           }
        <br>
        <br>
           return t90;
        <br>
        }
        <br>
        <br>
        <br>
      </blockquote>
      _______________________________________________
      <br>
      HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
      <br>
      <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
      <br>
      <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
      <br>
    </blockquote>
    <br>
  </body>
</html>