<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/122172>122172</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`std::sqrt(std::complex<T>)` produces incorrect results for large real components
</td>
</tr>
<tr>
<th>Labels</th>
<td>
bug,
libc++,
confirmed,
floating-point
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
lntue
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
cjdb
</td>
</tr>
</table>
<pre>
The following program produces an incorrect complex value due to floating-point numbers being unable to store a precise enough angle when converting to polar values.
```cpp
template<class T>
void sqrt()
{
auto const x = std::complex<T>{std::numeric_limits<float>::lowest(), 1.0f};
std::println("x = {} + i * {}", x.real(), x.imag());
auto const s = std::sqrt(x);
std::println("sqrt(x) = {} + i * {}", s.real(), s.imag());
}
int main()
{
std::println("==== expected ====");
std::println("x = {} + i * {}", std::numeric_limits<float>::lowest(), 1.0f);
std::println("sqrt(x) = 2.7105055e-20 + i * 1.8446744e19");
std::println("==== sqrt<float>() ====");
sqrt<float>();
std::println("==== sqrt<double>() ====");
sqrt<double>();
std::println("==== sqrt<long double>() ====");
sqrt<long double>();
}
```
```
==== expected ====
x = -3.4028235e+38 + i * 1
sqrt(x) = 2.7105055e-20 + i * 1.8446744e19
==== sqrt<float>() ====
x = -3.4028235e+38 + i * 1
sqrt(x) = -806332727296 + i * 1.8446743e+19
==== sqrt<double>() ====
x = -3.4028234663852886e+38 + i * 1
sqrt(x) = 1129.537270565105 + i * 18446743523953729536
==== sqrt<long double>() ====
x = -3.4028234663852886e+38 + i * 1
sqrt(x) = -0.4626957582701517 + i * 18446743523953729536
```
Confirmed by @lntue.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyklt1u4yoQx5-G3KBYMBh_XPgiSU-fYO-PsD1xWGHwAdxm3_4IN23dbrLbDwnJCR7m_5sPmVEh6MEiNkTuCYCxcUYCQOTdRs3x5HzT_ezbTev6X82PE9KjM8Y9ajvQybvBqzE9-7nDQJWl2nbOe-wi7dw4GTzTB2VmpP2MNDp6NE5FbYft5LSN1M5jiz7QFpO_2arWLGYhOo9U0cljpwNStG4eTlTZwSB9PKGlnbMP6JOrZD85o_yTUsgI26VVsKfVTRNhu4jjZFREIg6dUSHQH0T8Q9juwemehv98JFARqNPBck_YjlI1R5dkQqRnSsQdDbEnYkfE7hIZEYfFSbl_eWPnEb3u_jV61DEQcVjiTUbLa-MeMTwrwYHyjB1JeUfEovjiZfLaRmMXO3jSTlDlHSWwp5oS2F02Up3gQM-ZR2Ve_Z4zParh-X998b-OKLyN6JKA88r4Os3K8ANc4R1XuMaVzJeKpYYYlba_VeI6ChF3L4viecIuYk_XuwtF_e3sfqu6n00oZCVnkkmJW2ArIp5VeV6UeY68Xsd1O7Q3-VlkVsAL5O1kXbf_imLv5tbgJyTfHXh--zlV4-xAPy197dSbHn3-pLz__fdOZLunTtuKLGdQgZBIYC-qdYUJ232pG94BfKDUX6TZVqwQAkoooS6u0Ijk5SbQH8vxG1FeFKKSUFXFh9A4hzqTooSSyUJyJtf2FzoJok4mtRTFDca_9813QbcsywsoalnKCkrGJS8_gLpuNrY7OHvUfsSetr8oydlyZWebvhF9LWq1wYaXohAlzyXbnJqKgaiqvi17dqy5AKE62Qpoqy6vFfb5RjfAQDLOKuCQc5Yh50fedYXibZ-jRJIzHJU2mTEPY-b8sNEhzNhwAF7CxqgWTbjMD-08PH030yyh247AflmXre6Z_WXn7UhwmTx8k6S27TyEFKAOMbyKRx0NNqRg7--vWzc01KRgr2PK64ziMcwmBnp0nhrlB6TpwlpGF2fRxrCZvWlOMU4hOYZ7AveDjqe5zTo3ErhPTJfHdvLuJ3aRwP2SnUDg_pKghwb-DwAA__9EDYhz">