#1563: Provide always-working isnan etc. --------------------------+------------------------------------------------- Reporter: eschnett | Owner: Type: enhancement | Status: reopened Priority: major | Milestone: Component: Cactus | Version: development version Resolution: | Keywords: --------------------------+-------------------------------------------------
Comment (by eschnett):
The meaning of isnan is specified in the C/C++ standard in the same way as e.g. sqrt. If you call sqrt(1.0), then you expect the compiler to evaluate this at compile time in the same way as isnan(1.0); since the compiler knows the result, it doesn't need to emit a run-time call. If you then use -ffast-math, which means that you tell the compiler that it should assume that no calculation ever results in a nan and thus the expensive special cases for nan can be ignored, then the compiler will assume that isnan always returns false, and will omit the call.
No, there is no option to avoid this, except to not use -ffast-math, which prevent all sorts of very useful optimizations.
I expect that the speed difference between CCTK_isnan and isnan is mostly that isnan can be inlined, while CCTK_isnan cannot. Apart from this, they will likely lead to identical code on x86 architectures. On other architectures, CCTK_isnan may be significantly more expensive than isnan.
I will add support for float and long double as well.