When using xsimd::atan2 with float types and the -ffast-math compiler flag, the result for x=0.0 is NaN. Under standard math flags or with std::atan2, the result is correctly 1.570796.
To reproduce the bug:
#include <xsimd/xsimd.hpp>
#include <cstdio>
template<typename T>
[[gnu::noinline]] float xsimd_atan2(T v1, T v2) {
using batch = xsimd::batch<T>;
batch a = v1;
batch b = v2;
auto c = xsimd::atan2(a, b);
return c.get(0);
}
int main() {
float a = 1, b = 0;
printf("xsimd::atan(%.1f, %.1f) = %f\nstd::atan(%.1f, %.1f) = %f\n",
a, b, xsimd_atan2(a, b),
a, b, std::atan2(a, b));
}
When compiled with -ffast-math, the output is:
xsimd::atan(1.0, 0.0) = -nan
std::atan(1.0, 0.0) = 1.570796
Both the master branch and v14.0.0 yield this result.
Tested compilers and compiler flags that reproduce the error:
g++: 15.2.0 and 12.5.0, with -ffast-math
clang++: 18-20, with -ffast-math -O1
Intel 2025.2.1 prints the correct result without the error.
Testing platform: Ubuntu 25.10 on AMD EPYC 9354.