Nuklear
Nuklear copied to clipboard
Unsafe floating-point comparisons with '==' or '!='
Comparison results of floating-point values with the == or != operators depend on compiler optimizations, architecture and precision and there are corner cases like NaN, infinity or -0.0.
Tag 4.12.5 produces the following warnings in GCC and CLang using -Wfloat-equal:
../../nuklear.h:6546:10: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:6546:22: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:7297:11: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:7904:39: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:7939:16: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9340:34: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9340:49: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9363:34: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9363:49: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9387:22: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9387:37: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9411:19: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9411:31: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9433:31: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9433:43: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9609:18: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9609:31: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9709:18: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9709:31: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9736:18: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:9736:31: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:10245:21: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:10396:21: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:10486:21: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:10593:16: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:10642:11: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:13667:21: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:13667:47: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:14594:18: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:14759:11: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:14773:11: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:14775:16: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:14821:18: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:15070:20: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:15250:21: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:15449:16: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:15450:16: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:15451:19: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16141:10: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16193:17: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16193:33: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16311:14: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16348:35: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16355:22: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16377:66: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16417:32: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16421:31: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:16422:34: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:20383:50: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:20383:83: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:20383:123: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:21708:28: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:22084:16: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
../../nuklear.h:28043:32: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
Example warning sites:
../../nuklear.h: In function 'nk_atan2':
../../nuklear.h:6546:10: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
6546 | if(y == 0.0 && x == 0.0) return 0.0f;
../../nuklear.h: In function 'nk_panel_end':
../../nuklear.h:20383:50: warning: comparing floating-point with '==' or '!=' is unsafe [-Wfloat-equal]
20383 | int has_input = ctx->input.mouse.delta.x != 0 || ctx->input.mouse.delta.y != 0 || ctx->input.mouse.scroll_delta.y != 0;
Could it be that hard to reproduce anomalies of sliders, scroll bars may have to do something with these comparisons?