https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121615
Bug ID: 121615 Summary: Function abs(complex<int>) does not compute correct results Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: chris21k at gmx dot de Target Milestone: --- $ cat show_abs_bug.cpp #include <complex> #include <iostream> int main() { std::cout << std::abs(std::complex<int>(3, -4)) << std::endl; // expected sqrt(3^2 + (-4)^2) = 5 and not 4 } $ g++ show_abs_bug.cpp -o show_abs_bug $ ./show_abs_bug 4 $ less /usr/include/c++/complex # snippet // 26.2.7/3 abs(__z): Returns the magnitude of __z. template<typename _Tp> inline _Tp __complex_abs(const complex<_Tp>& __z) { _Tp __x = __z.real(); _Tp __y = __z.imag(); const _Tp __s = std::max(abs(__x), abs(__y)); if (__s == _Tp()) // well ... return __s; __x /= __s; __y /= __s; return __s * sqrt(__x * __x + __y * __y); } $ g++ --version g++ (Debian 14.2.0-19) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. cat /etc/issue Debian GNU/Linux forky/sid \n \l $ uname -a Linux betty 6.12.38+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.38-1 (2025-07-16) x86_64 GNU/Linux (The called) above abs implementation in header file <complex> imho seems to only be correct for complex<"floating point"> but not for complex<"integral"> . Either there is a bug in the detection which implementation should be called or the above implementation should more general. Btw. same behaviour with gcc 12.2.0 in Debian bookworm. Unfortunately, I have no test with a newer gcc, sorry for that. Many thanks, Chris