Potenzrechnen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,
    ich habe mir einen Arduino zugelegt und mache die ersten Gehversuche mit C++ und kann bisher nichts tolles an dieser Sprache entdecken.
    Einfaches Sricpt und schon hapert's. Und da es keine dummen Fragen gibt. hier die meinige:


    => liefert falsche Ergebnisse:
    1, 2, 3, 7, 15, 31, 63, 127, 255
    wahrscheinlich weil in C++ 2*2 gleich 3,99999999999999 ist und als integer dann der Rest abgeschnitten wird ...
    deklariere ich die Variable 'shifting' als 'float' oder 'double' bekomme ich zwar die rictigen Ergebnisse, allerdings als Kommazahlen (klar, wegen: 'double'), also:
    1.00, 2.00, 4.00, 8.00, 16.00, 32.00, 64.00, 128.00, 256.00

    ich benötige diese Zahlen als Integer!

    Jemand hier, der einen schnellen Tipp hat ?

    Danke im Voraus
    so long

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • benutze die math Lib:

    Code
    #include <Math.h>

    dort gibt es die "round()" Funktion
    Automatisch zusammengefügt:

    also nochmal lang:

    Code
    int value = (int) round(pow(2,i));

    oder, wenn die round funktion nicht greifbar/genehm ist:

    [edit]: besseren Funktionsnahmen gegeben...

    Code
    int round2int(double d) {
     return (int) floor(d + 0.5);
    }
  • ja, super Zentris. round() ist mir sehr angenehm, kenne ich aus Python sehr gut ;)
    DANKE !, funzt natürlich !

    so long

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Hallo Perlchamp,

    nutze für Potenzierungen von Ganzzahlen zur Basis 2 den Operator bitshift left <<.

    1 << 0 = 1
    1 << 1 = 2
    ...
    1 << 7 = 128

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Hallo Perlchamp,

    nutze für Potenzierungen von Ganzzahlen zur Basis 2 den Operator bitshift left <<.

    1 << 0 = 1
    1 << 1 = 2
    ...
    1 << 7 = 128

    Beste Grüße

    Andreas

    ... und das soll ich jetzt SO in meinen Code eingeben ?

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Hallo Perlchamp,

    statt

    Code
    pow(2,i)

    schreibst Du

    Code
    1 << i

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (26. März 2017 um 23:11)

  • danke andreas, funzt auch.

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Hallo Perlchamp,



    danke andreas, funzt auch.

    Hallo Perlchamp,

    Eleganter wird's aber, wenn Du shifting auf 1 setzt und dann in der Schleife nur multipilzierst

    Code
    shifting *= basis

    oder

    Code
    shifting *= 2

    Dann kommst Du gar nicht erst in die Verlegenheit, Rundungsfehler einzufangen.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • das ist eine 'spezielle' Abkürzung?
    was, wenn die Basis nicht 2, sondern 3, 4, .., n ist ?
    gibt's da auch etwas?
    da der arduino wenig Speicherplatz hat, wäre so eine 'Variante' natürlich vorteilhaft ...

    so long

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • die Operation x*x wird etwas schneller ausgeführt als pow(x,2)

  • Hallo Perlchamp,


    das ist eine 'spezielle' Abkürzung?
    was, wenn die Basis nicht 2, sondern 3, 4, .., n ist ?
    gibt's da auch etwas?
    da der arduino wenig Speicherplatz hat, wäre so eine 'Variante' natürlich vorteilhaft ...

    so long

    dann so:

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Hallo Perlchamp,


    dann so:

    Beste Grüße

    Andreas

    nicht ganz, mein freund ... dann mußt du 'long shifting' deklarieren ... ;)

    meigrafd:
    aber nur bei Zahlen gleicher Basis und Exponenten (x*x), oder?
    bei allen anderen Potenzierungen ist pow(x,y) schneller (meine ich gelesen zu haben) ...

    @alle:
    was mir auf anderen seiten (nach 'c++ potenzieren' gesucht) angeboten worden ist, wie rekursive Funktionen und Zeug ... alter Schwede ... Python sagt mir mehr zu, aber mit Arduino wohl nicht zu machen ...
    so ein unstrukturierter Sch... wie C++ ist mir selten untergekommen, aber ich möchte hier keine Grundsatzdiskussion anstoßen, UND:
    das Thema steht bereits seit einer Stunde auf "erledigt" UUUUUND vielen Dank euch allen für die Vorschläge und die Zeit, die ihr dafür investieren mußtest - top!
    Habe wieder viel dazugelernt !

    so long

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Servus zusammen,

    Ich oute mich mal als absoluter Anfänger und stelle mal ne kleine Frage um etwas zu lernen.

    Print und println ist doch keine cpp Syntax oder nicht? Ich kenns nur mit cout.

    Das weiteren werden bei mir die Zahlen auch ohne Komma dargestellt wenn ich mit pow potenziere und Double als Typ verwende.

    Wäre es nicht einfacher Double zu verwenden für die Berechnung und den Wert nach int zu casten?

    Gruß

    Einmal editiert, zuletzt von WaldiBVB (27. März 2017 um 11:51)

  • Hallo WaldiBVB,


    Print und println ist doch keine cpp Syntax oder nicht? Ich kenns nur mit cout.


    Hier geht's um die Programmierung des Arduino. Dessen C++ "kann das".



    Das weiteren werden bei mir die Zahlen auch ohne Komma dargestellt wenn ich mit pow potenziere und Double als Typ verwende.


    Auf einem Arduino? Oder einem Räscheknäscht in C++?


    Wäre es nicht einfacher Double zu verwenden für die Berechnung und den Wert nach int zu casten?

    Die Mathe-Bibliothek des Arduino erwartet für die Funktion pow(base, exponent) als Parameter jeweils Fließkommazahlen. Damit hast Du insbesondere bei ganzzahligen Exponenten erhebliche Abweichungen des aus der Mathematik gewohnten Verhaltens bei entsprechender Potenzierung ganzer Zahlen mit ganzen Zahlen, da bei der Umwandlung "Deiner" Ganzzahlen ins Fließkommaformat sich schon mal Fehler einschleichen, die bei dieser Funktion im wahrsten Sinne des Wortes potenziert werden.

    Sofern ganzzahlige Werte miteinander potentenziert werden, würde ich solche Allrounder-Funktionen aus der Mathekiste meiden und die hier gebrachten Vorschläge für ganze Zahlen nutzen. Insbesondere bei der Berechnung von 2er-Potenzen sind die Operatoren << und >> bezgl. Genauigkeit und Geschwindigkeit nicht zu überbieten.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (27. März 2017 um 12:34)

  • Hallo WaldiBVB,


    Ich hab's natürlich auf einem Räscheknäscht in Code::Blocks nachvollzogen.


    Ja dann ...


    Mir war nicht klar das die Arduino IDE da anders arbeitet. Ich sag ja, wieder was gelernt. :P


    Das liegt nicht an der Arduino IDE, das liegt am Laufzeitsystem und der Umsetzung der mathematischen Funktionen.

    Ich habe mir mal die Mühe gemacht, herauszufinden, wie die trigonometrischen und Lograrithmus-Funktionen in Programmiersprachen umgesetzt werden. Meistens werden Potenzfunktionen eingesetzt (z.B. Taylorreihen). Die werden an einer bestimmten Stelle abgebrochen. Manche dieser Ersatzfunktionen konvergieren schnell (==> akzepbtable Genauigkeit), andere konvergieren langsam bzw. schlecht (==> erhebliche Abweichung des Ergebnisses).

    Spaßeshalber habe ich das mal durch die Ersatzfunktion der Kettenbrüche (Srinivasa Ramanujan, 1887 - 1920, Link) ersetzt. Die Kettenbrüche konvergieren mit hoher Genauigkeit sehr schnell - lassen sich also mit Erhöhung der Rechentiefe gegenüber den Standard-Mathe-Bibliotheken erheblich genauer berechnen.
    In meiner Mathe-Bibliothek gibt es jetzt drei Varianten:
    - die klassische der jeweiligen Progrmmiersprache-
    - eine eigene Umsetzung, die so genau wie die klassische Umsetzung arbeitet - nur schneller ist
    - eine eigene Umsetzung in der Programmiersprache Icon, die mit bis zu beliebiger Genauigkeit arbeitet. Hier werden dann auch keine Fließkommazahlen mehr eingesetzt, sondern nur noch eigene LIA-Algorithmen [LIA = Large Integer Arithmetics] eingesetzt. Diese Funktionen brauchen dann aber deutlich länger. Ab einer gewissen Stellenanzahl geht der Löwenanteil auf die Konvertierung aus der LIA-Welt drauf, um das Ergebnis wieder darzustellen. Aber so ist das halt...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (27. März 2017 um 13:27)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!