<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Double, přesněji "float de jure vedený jako double" je tam jen
    proto, že je to default výsledek zápisu desetinnégo čísla jako
    parametru testované funkce:-)<br>
    <br>
    Použití floatu v MCU se nevyhýbám. Když dělám zakázku kde nebudou
    dělat milion kusů, nebo něco pro sebe, tak je levnější použít o
    10-20 Kč dražší procesor, takže má místo 2k flashky třeba 16 nebo 64
    a najednou se floaty v pohodě vejdou. Tím odpadnou veškeré starosti
    s udržením čísel ve správných mezích po celou dobu výpočtu. Ty věci
    pak obvykle chodí na první dobrou. Takže objednám plošňáky, napíšu
    program, po osazení už jen doladím pár detailů.<br>
    <br>
    Typická cesta dat u mě vypadá tak, že ADC měří, sčítá do longu a až
    má nasčítáno třeba tisíce až desetitisíce vzorků, nastaví adSync=1.
    Toho si všimne čekací funkce, podělí to počtem vzorků, výsledek už
    má floatový, ten pak přes floatové kalibrační konstanty přepočítá na
    požadovaný výsledek, taky float. Dál se všechno dělá floatově a jen
    když to chci zobrazit/odeslat, tak úplně poslední krok je klasika
    postupné dělení 10 z (unsigned) longu.<br>
    <br>
    Obecně by  se mi líbila i možnost použití skutečného double, protože
    třeba pro data z 24b ADC je float už problém, na hodnotu zbyde 23b.
    Zajímavá otázka je, za jak dlouho pak by pak AVR spočítalo třeba
    logaritmus, ale u velkých přesností se obvykle velkej refreshrate
    nepožaduje. Tzn. jestli se 5 sekund měří, tak se klidně může
    paralelně 5s počítat.<br>
    <br>
    PH<br>
    <br>
    <div class="moz-cite-prefix">Dne 22.04.2024 v 15:34 Petr Labaj
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:9eeedb94-3c69-b13d-138b-6102e9578e25@volny.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      Já už jsem se v tomto vlákně dávno ztratil a tak už jsem mimo.<br>
      <br>
      Ale když teď píšete o double - já myslel, že cílem, že všechno
      floatové<br>
      eliminovat a používat čistě integer, třeba s posunutou bází.<br>
      Takže mít proměnné třeba v desetitisícinách voltů a tyhle
      formátované<br>
      tisky použít pro výpis v lidském formátu.<br>
      Takže to se asi pletu, žejo.<br>
      <br>
      Já jsem to vždy na MCU bral tak, že float se použije opravdu jen
      když už<br>
      to opravdu jinak nejde. A protože to skoro vždy nějak jde, tak se
      raději<br>
      nepoužije vůbec nikdy.<br>
      <br>
      PL<br>
      <br>
      ******************<br>
      <br>
      <div class="moz-cite-prefix">Dne 22.4.2024 v 11:13 Pavel Hudeček
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:443eff26-6a0d-4dcd-8070-60dcdd02a963@seznam.cz">
        <meta http-equiv="Content-Type"
          content="text/html; charset=UTF-8">
        Zajímavé je, jak různé konstrukce můžou vést k různé délce kódu.<br>
        <br>
        Rozdíl 500 B trochu překvapil, ale OK. Použito je long a double.<br>
        Vlastně bych to čekal spíš naopak, když se u té delší verze
        nepředává val. Ale chápu, že tohle asi snadno sežere nějaká
        optimalizace, když se v val nic nedělá.<br>
        <br>
        Nějaké nápady na další konstrukce, které by mohly být menší?<br>
        <br>
        Dost ale překvapilo 30 B u <b>nepoužitých funkcí</b> test.<br>
        WTF?<br>
        <br>
        PH<br>
        <br>
        <br>
        <font face="monospace">template <typename T> class
          clDetTyp { // ===========================<br>
          public:<br>
              //const char det() const;<br>
               char det(unsigned int x)  {return 'u';}<br>
               char det(int x)  {return 'i';}<br>
               char det(unsigned long x)  {return 'U';}<br>
               char det(long x)  {return 'L';}<br>
               char det(float x)  {return 'f';}<br>
               char det(double x)  {return 'd';}<br>
          };<br>
          <br>
          /*// tohle bylo delsi o ~500B, const nemají vliv<br>
          template <> const char clDetTyp<unsigned
          int>::det() const { return 'u';}<br>
          template <> const char clDetTyp<int>::det() const
          {    return 'i';}<br>
          template <> const char clDetTyp<long>::det() const
          { return 'L';}<br>
          template <> const char clDetTyp<float>::det()
          const { return 'f';}<br>
          template <> const char clDetTyp<double>::det()
          const { return 'd';}*/<br>
          <br>
          template<typename T><br>
          void uartSendF(const char *t, T val, uint8_t mist) { //
          =============<br>
              clDetTyp<T> d;<br>
              if (d.det(val)=='f' || d.det(val)=='d') {<br>
                  float m = 1.0;<br>
                  for (uint8_t n=0; n<mist; n++) m*=10.0;<br>
                  uartSendF_(t, static_cast<long>(val*m), mist);<br>
              } else if (d.det(val)=='L') uartSendF_(t, val, mist);<br>
              else uartSendF_(t, static_cast<long>(val), mist);<br>
          }<br>
          <br>
        </font><font face="monospace">/*// tyhhle funkce nejsou použitý,
          ale zakomentování ušetří 30B (</font><font face="monospace">uartSendF
          s jedním PSTR se používá i jinde)<br>
          // Změna délky PSTR v nich nevede ke změně rozdílu zabrané
          flash<br>
        </font><font face="monospace">const void test(int x) {<br>
              uartSendF(PSTR("test: int\r\n"));<br>
          }<br>
          void test(char x) {<br>
              uartSendF(PSTR("test: char\r\n"));<br>
          }*/</font><br>
      </blockquote>
    </blockquote>
  </body>
</html>