Forum: Compiler & IDEs std::lerp mit NaN input


von lerp (Gast)


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.

von PittyJ (Gast)


Lesenswert?

Warum gibt man da NaN als Parameter ein?

von Klaus W. (mfgkw)


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.

von Jemand (Gast)


Lesenswert?

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 ;)

von Al Fine (Gast)


Lesenswert?

Es wäre trotzdem gut, wenn sich das NaN duch die Rechnung fortpflanzen 
würde - dann braucht man ggf. weniger checks für Zwischenergebnisse.

von Klaus W. (mfgkw)


Lesenswert?

Ja, aber genau das ist wohl verbockt beim lerp.

Sollte man vielleicht mal anmeckern, sonst wird es nicht besser.
Panta rhei, wie der Alt-C-ler so schön sagt.

von Al Fine (Gast)


Lesenswert?

Zumindest könnte die Garantie für Platformen gegeben werden, wo das kein 
Problem darstellt.

von Oliver S. (oliverso)


Lesenswert?

Das nicht funktionierende constexpr ist auf jeden Fall ein bug.

Oliver

von Al Fine (Gast)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wieso braucht's für sowas triviales wie die lineare Interpolation zweier 
Skalare denn eine Erweiterung der Standard-Lib?

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

PittyJ schrieb:
> Warum gibt man da NaN als Parameter ein?

Vorallem er gibt "nan" kleingeschireben an und "std::nan" ist irgendwie 
anders definiert als hier verwendet?
- https://en.cppreference.com/w/cpp/numeric/math/nan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.