Komma mit Potenz verschieben

Hallo Leute,
ich habe aktuell ein Problem bei dem ich nicht weiterkomme. Und zwar möchte ich in meinem Code Milisekunden in Sekunden umrechnen, sprich das Koma verscieben. Bis jetzt habe ich das mit Potenzen versucht. Der gewünschte Erfolg blieb aber leider aus. Im Serialmonitor verschiebt sich jetzt nicht das Komma, sondern r zählt einfach ins Negative. Hat jemand von euch vielleicht ne idee?
Hier nochmal der Code zur Übersicht.

#include <StopWatch.h>

StopWatch sw_millis;    // MILLIS (default)
StopWatch sw_micros(StopWatch::MICROS);



void setup() {
    float sec;
    int mili;
    int v;
    int entfernung = 3; //Entfernung in Cm von Messpunkt 1 zu Messpunkt 2
    Serial.begin(9600);
    sw_millis.start();
    sw_micros.start();
}


void loop() {
    int mili = sw_millis.elapsed();
    Serial.print("sw_millis=");
    Serial.println(sw_millis.elapsed());
    Serial.print("sw_micros=");
    Serial.println(sw_micros.elapsed());
    
   float sec = mili*10^(-6);
     Serial.println(sec);
   
    
    

    delay(1000);
}

Ist bis jetzt nur der Testcode der StopWatch Libary. Später soll die Stoppuhr gestartet werden wenn ein Sensor getriggert wird, und wieder angehalten wird wenn ein zweiter getriggert wird. Und aus dem Wert und der Entfernung zwischen den zwei Messpunkten errechne ich dann die Geschwindigkeit. Und es müssen Milisekunden sein, da die Messstrecke vorraussichtlich nur 5 cm lang ist. Was ich mir jetzt übrlget habe, da ich in die Formel v= s/t ja auch nicht meter sondern Centimeter einsetze, ob ich nicht gleich auch Milisekunden einfügen kann, und das dann später von cm/milisekunde in meter/sekunde umrechnen kann, in dem ich beides mal 100 nehme?

Vielen dank schonmal im Vorraus,
Datus

r zählt einfach ins Negative

versteh ich nicht

10 ^ (-6) ist nicht 0.000001

Schau mal nach, was ^ bei c++ und Datentyp int bedeutet :wink:

void loop() {
 float sec = millis() / 1000; 
 Serial.println (sec);
 delay (777); // damit man was buntes sieht
}

Nachtrag:
Und dann ändere die 1000 in 1000.0 ! und es wird noch viel bunter :wink:

datus:
Was ich mir jetzt übrlget habe, da ich in die Formel v= s/t ja auch nicht meter sondern Centimeter einsetze, ob ich nicht gleich auch Milisekunden einfügen kann, und das dann später von cm/milisekunde in meter/sekunde umrechnen kann, in dem ich beides mal 100 nehme?

Am besten rechnest Du die Strecke in Millimetern und die Zeit in Millisekunden.

Bei der Division Millimeter pro Millisekunde kannst Du das Milli dann kürzen:
Ein Millimeter pro Millisekunde ist derselbe Zahlenwert wie ein Meter pro Sekunde, ohne Umrechnungsfaktor.

C hat keinen Potenz Operator. In Python z.B. gibt es **. In C ist ^ ein bitweises XOR. Für die Potenz brauchst du die pow() Funktion:
http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html#ga41b41c307b8f96760e9c0c17180b241b

Besser ist aber man schreibt bei sowas eine normale Gleitkommazahl (bzw. man macht eine Division daraus), auch wenn es weniger leserlich ist. Die wissenschaftliche Schreibweise kannst du in einen normalen Kommentar dahinter packen.

pow() willst du nicht.
const float factor = 1.e-6; // wenn du die ZehnerPotenz-Schreibweise verwenden möchtest.
Ich glaube nicht, dass der Compiler pow(10,-6) zur Compilierzeit ausrechnet, ausserdem sieht es auch nicht schöner aus.

Generell sollten bei MicroControllern Gleitkomma-Berechnungen nur "im Notfall" verwendet werden, da hierfür keine Hardware-Unterstützung vorhanden ist und alles per Software ( langsam, mit Befehlen Flash-Speicher ) germacht wird.

Stimmt. Da geht auch. Ganz vergessen, da ich es kaum verwende :slight_smile:

Man sieht auch wieder sofort die typischen Rundungsfehler. In Visual Studio macht er da 9.999999747 * 10^-6 draus. Bei double (was es auf dem Arduino nicht gibt) macht er dann immerhin 1.0000000000000001 * 10^-5 :slight_smile:

Hallo,

double gibt es auf dem Arduino. :wink:
Man kann auch viel mit Ganzzahlen machen. float braucht man nicht unbedingt.
Wobei die Rechenzeit nicht der entscheidende Unterschied ist, sondern die Genauigkeit, wie schon angesprochen wurde.

Du weißt was ich meine. Nur auf dem Due richtig. Auf den kleineren ist es das gleiche wie float

Hallo,

ich wollte Dich jetzt wirklich nicht ärgern. Ich hatte es falsch in Erinnerung. Großes Entschuldigung. =(
Ich dachte das double und float zwar beide 4Byte groß sind, aber double eben Ganzzahlig und float Fließkomma. Stimmt aber nicht. double und float sind beide Fließkomma. Außer beim Due. Dort ist double 8Byte groß. So wie Du schon richtig geschrieben hast.

@datus
Du solltest das mit den globalen und lokalen Variablen mal nachlesen ansonsten machst Du in 5 Minuten den nächste Tread auf.
Grüße Uwe