Modulo mit float

Moin,
wie kann ich folgende Excel-Anweisung nach Arduino transformieren?
Julianisches Datum = 2455001.5 [Zelle C3] (zu beachten ist, dass der Nachkommateil jeden Wert annehmen kann (er kennzeichnet die Tageszeit))

JD = INT(C3-0.5)+0.5 [C5]
n = MOD(JD+1.5,7)
n=5 wäre die richtige Lösung

Arduino meckert, weil JD 'double' ist
danke

const float C3 = 2455001.5;
const float C5 = 0.5;
const float plus = 1.5;

int n = 0;

void setup()
{
  Serial.begin(115200);
  n = (uint32_t)(((C3 - C5) + C5) + plus) % 7;
  Serial.println(n);
}


void loop()
{
}

Danke, aber passt leider nicht:
Serial.println("DOW");
jd = 2459612.42744;
//jd=2455001.5;
Serial.print ("jd start");
Serial.println (jd,3);
const float C3 = jd;
const float C5 = 0.5;
const float plus = 1.5;

int n = 0;
n = (uint32_t)(((C3 - C5) + C5) + plus) % 7;
Serial.print ("n");

Ergebnis 3

jd = 2459612.42744;
müsste n=1 => Montag raus kommen ( jd = 2459612.42744; ist 'jetzt')

Sorry, müsste n = 2 = Dienstag sein.
OT: das aktuelle Geschehen macht einen leicht bekloppt

jaja..
Ich hab mal was schickes.
Was ergibt:

const float C3 = 2455001.5;

void setup()
{
  Serial.begin(115200);
  Serial.println(C3);
  float myFloat = (C3 * 10);
  Serial.println(myFloat);
  Serial.println(myFloat - 5);
}


void loop()
{
}

21:24:44.244 -> 2455001.50
21:24:44.244 -> 24550016.00
21:24:44.284 -> 24550012.00

Bin leider nicht eher dazu gekommen

Das hängt auch von der Hardware ab:

const double C3 = 2455001.5;

void setup()
{
  Serial.begin(115200);
  delay(1000);
  Serial.println(C3);
  double myFloat = (C3 * 10);
  Serial.println(myFloat);
  Serial.println(myFloat - 5);
}

void loop() {}

Ausgabe ESP32:

2455001.50
24550015.00
24550010.00
const double C3 = 2459612.42744;
const double C5 = 0.5;
const double plus = 1.5;

int n = 0;

void setup()
{
  Serial.begin(115200);
  delay(1000);
  n = (uint32_t)(((C3 - C5) + C5) + plus) % 7;
  Serial.println(C3, 7);
  Serial.println(n);
}

void loop() {}

Ausgabe ESP32:

2459612.4274400
2

Die jüngeren Teensys haben eine, von mir noch nicht getestete, Recheneinheit verbaut.

Kein Problem.

Ich wollte Dir nur zeigen, das die Rechnung nicht stimmt (Das Ergebnis sollte ja 2455001.50 # 24550015.00 # 24550010.00 sein) und damit Dein Projekt noch einmal überdacht werden muss.

Die Definition von rationalen Zahlen, im Volksmund auch float genannt, beruht darauf, dass bei einer Division kein Rest entsteht, es also kein Modulo geben kann.
Bittel ändere wenigstens den Titel deines Threads. Er tut mir weh.
Dir geht ja darum, aus einer Gleitkommazahl, die in Excel ein Datum mit Uhrzeit darstellt, den Wochentag zu bestimmen. Das einzige Problem das ich sehe ist, dass Montags um 23:59 immer noch Montag ist und man sich möglichst keine Rundungsfehler einfangen sollte.
Auf jeden Fall solltest du aus Float erstmal eine passende Integer-Zahl machen, bevor du durch 7 teilst.

Das ist nicht mein Thread.
Und ja, da ist im Ausgangspost auch ein modulo drin, was dann in #2 auch funktionierte - später nur nciht.

Das ist mir bewusst, und dein cast nach (uint32_t) in #2 ist ja auch nett.

float x= 100.999;
void setup(){
  Serial.begin(115200);
  Serial.println((uint32_t)x);
}

liefert noch 100.
Aber mit x = 100000.999 funktioniert's nicht mehr richtig

Das habe ich versucht darzustellen. Nimm nach dem Komma 99 weg, gehts noch. Auch mit einer 0 mehr vor dem Komma. :wink:

The float data type has only 6-7 decimal digits of precision.

Aber nur bei Arduino.
ESP und andere 32 Bit Procesoren haben viel genauere Ergebnisse wobaj bei TINI noch dazu angeblich zusätzliche Rechneeinhat drin ist, womit er noch genauer sein sollte.

Ja, - das war die Vorgabe in #1. Darum habe ich gezeigt, das es vielleicht nicht die beste Idee ist und er sein Projekt nochmal überdenken muss. Entweder einen 32bitter, einen mit extra Recheneinheit, oder gänzlich umrechnen... :slight_smile:

Du meinst Teensy?

Die "Float point math unit, 64 & 32 bits" hätte ich schon mal gerne getestet, hatte aber noch keinen Anlaß dazu.

Genau dieser :wink:
Danke für Berechtigung

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.