std::lerp mit NaN input

Gast #6773812
Lesenswert?

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
Lesenswert?

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 #6774565
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren