std::lerp mit NaN input

Gast #6773812
Für eine Firmware habe ich eine LUT implementiert, die std::lerp 
benutzt.
Ich wurde jetzt jedoch überrascht, dass ein lookup mit NaN eine Zahl 
ergab (also nicht NaN). Das macht gar keinen Sinn. Als compiler benutze 
ich GCC9.

Stellt sich heraus, dass
1
std::lerp(1, 2, nan) -> 2 mit GCC
2
std::lerp(1, 2, nan) -> nan mit MSVC (daher fiel mir das auch nicht in unit tests auf)

siehe hier:
https://godbolt.org/z/Y6dKqqKP6

Link zu lerp: https://en.cppreference.com/w/cpp/numeric/lerp

Bonus: std::lerp() ist gemäß c++20 constexpr, aber GCC hat da 
anscheinend einen bug und std::lerp() ist nicht constexpr wenn t==NaN.

Da std::lerp a + t*(b - a) implementieren soll, scheint die 
Implementierung von GCC fehlerhaft zu sein.
#6773956
Wenn ich das richtig sehe, ist es ohne constexpr auch nicht besser.

Zumindest werden die Zusicherungen bzgl. des return-Wertes nicht 
verletzt, weil dein Fall da gar nicht vorkommt.
Unerwartet finde ich dein Ergebnis auch, aber das ist natürlich kein 
Kriterium.

Ich denke, lerp ist aktuell zu schwach auf der Brust in diesem Fall.
Übrigens auch mit signaling_NaN.
Gast #6773975
lerp schrieb:
> Das macht gar keinen Sinn.

Das einzige Problem, das ich sehe, ist, dass da keine Zufallslogik 
eingebaut wurde, um ab und zu mal eine Zahl oder doch ein NaN 
zurückzugeben - für erzieherische Zwecke ;)
Gast #6774565
Noch einmal reflektiert, sollte der Standard lerp mit Ausnahmewert 
besser als undefined deklarieren. Das öffnet dann wenigstens den Weg für 
weitere Zusicherungen im Gegensatz zu einem einfach unspezifiziertem 
Verhalten.
Und den constexpr Bug müssen die dann auch nicht mehr fixen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.