km/h in Windstärke

Hallo,

ich möchte km/h in Windstärke umrechnen.
In Excel funktioniert es mit

=((B1*10/36)/0,836)^(2/3) B1 ist die Geschwindigkeit

mein Versuch ist

byte Beaufort(uint8_t kmh){

  return (pow((kmh*(10/36)/0.836),(2/3)))+0.5;

}

Funktioniert aber nicht!

LG

Hi

Was erwartest Du als Rückgabe und was bekommst Du?
Lasse Mal eine FOR-Schleife über diese Funktion laufen und lasse Dir Input und Output der Funktion ausgeben.

MfG

postmaster-ino:
Was erwartest Du als Rückgabe

Das richtige Ergebnis???

Als Ergebnis habe ich immer nur 1 von 0-200.

Der Standardtyp ist Integer, Du möchtest aber mit float rechnen wie in Excel:

byte Beaufort(uint8_t kmh) {
  return (pow((kmh * (10.0 / 36) / 0.836), (2.0 / 3)) + 0.5);
}

In dieser kurzen Form machst Du ein paar Typumwandlungen, deutlicher wird das so:

byte Beaufort(uint8_t kmh) {
  float k = 10.0 / 36.0 / 0.836;
  float e = 2.0 / 3.0;
  double w = pow(kmh * k, e) + 0.5;
  return (byte(w));
}

pow()

Danke, so funktioniert es.

Hi

ar182:
Das richtige Ergebnis???

Nichts für Ungut, aber so weit konnte ich mir Das schon denken.

Als Ergebnis habe ich immer nur 1 von 0-200.

DAS war ungefähr die Antwort auf meine Frage.
Da Du ja schon die Lösung bekommen hast, hast Du einen Unterschied in Deinem und den Weg von agmue gefunden?

MfG

Wenn du es optimieren möchtest und sonst keine float Berechnungen machst, ist das Nachsehen in einer Tabelle erheblich besser.
Sind ja nur 12 mögliche Ergebnisse.

michael_x:
... ist das Nachsehen in einer Tabelle erheblich besser.

Ja, ich hatte auch noch diese Möglichkeit probiert:

byte Beaufort(uint8_t kmh) {
  byte w = 0;
  switch (kmh) {
    case 0:
      w = 0;
      break;
    case 1 ... 5:
      w = 1;
      break;
    case 6 ... 11:
      w = 2;
      break;
    case 12 ... 19:
      w = 3;
      break;
    case 20 ... 28:
      w = 4;
      break;
    case 29 ... 38:
      w = 5;
      break;
    case 39 ... 49:
      w = 6;
      break;
    case 50 ... 61:
      w = 7;
      break;
    case 62 ... 74:
      w = 8;
      break;
    case 75 ... 88:
      w = 9;
      break;
    case 89 ... 102:
      w = 10;
      break;
    case 103 ... 117:
      w = 11;
      break;
    default:
      w = 12;
      break;
  }
  return w;
}

Oder so:

const byte speed[] = {1, 6, 12, 20, 29, 39, 50, 62, 75,  89, 103, 118};
byte Beaufort(uint8_t kmh) {
   for (byte i = 0 ; i < sizeof(speed); i++) 
     if (kmh < speed[i]) return i;
   return 12;
}

:slight_smile:

Oder mit den Daten im Programmspeicher:

const char speed[] PROGMEM= {1, 6, 12, 20, 29, 39, 50, 62, 75,  89, 103, 118};
byte Beaufort(uint8_t kmh) {
   for (byte i = 0 ; i < strlen_P(speed); i++)
     if (kmh < pgm_read_byte(speed+i)) return i;
   return 12;
}

Viele Wege … :slight_smile: