<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/89668>89668</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Fixed point integral sqrt (uksqrtui) crashes with LIBC_FAST_MATH and produces an incorrect value without LIBC_FAST_MATH
</td>
</tr>
<tr>
<th>Labels</th>
<td>
bug,
libc
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
lntue
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
PiJoules
</td>
</tr>
</table>
<pre>
```
#include <stdio.h>
#include <stdint.h>
extern "C" unsigned _Accum uksqrtui(uint32_t);
int main() {
unsigned _Accum x = uksqrtui(65529);
printf("%f\n", (float)x);
}
```
This will crash with `integer divide by zero` on an x86-64 linux. It looks like the main reason for this is the `FastFractType` for `SqrtConfig<unsigned int>` is a 16-bit `unsigned fract`, so when we get to `FracType r = a * x_frac + b;`, we end up with `(0x820c * 0xfff9) // 2**16 + 0x7df8 == 0x10000` but we only retain the lower 16 bits for an unsigned fract. This is with `LIBC_FAST_MATH`.
Without `LIBC_FAST_MATH`, the error seems less clear and this will produce a value of `3.953979`. The final decimal result for either of these modes should be around `255.98632775990205`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx0VE2P4zYM_TXKhRhDpuOvgw-ZTINu0QIFNkCPgSzTsTqKlNXHxNNfX8hxZzNtFwgcARTfI98TKbxXZ0PUsfKZIWoTIjFEVr5sRAyTdd3v6hcbNflNb4f3jlV8_fEXxncMC2WkjgMBK_Y-DMpmEyt--lHUhMfw8qU5kDPAEPcMEaJZChrgtJMyXiC--m8uRMWwicqEAk-BYcuK50cMZQJchDIMG4YtsHqNwn_gZmDFyyNoVZbYPiICXJ0yYVywkGE5snJvluMeGDajtiKVMH8qo35ZD__SZ_keJ-XhprQG6YSf4KbCBKziygQ6k4NBvamBoH-Hv8hZVnGwBoSBuameqi1oZeKcwZcA2tpXD1q9EoSJlpbBkfDWwGgdhMSj_BJjFT8IHw5OyHB8v1JCTXdS4Os3F_bWjOrMiv2HQsqEZE3FE4SAvHrqVUjXP26MCSz1hnvwFm4TGbgRnClAsAujEzKRgVtkFsBwB_Mp5QHDZ-iTYPf8GwGZAeL1Qw2GDZ8b5HLJ4vM4ju3iJh4YHgAZ7hju8mpB4nM9jE1iSUR8zjnnSXboY0jY1uh3cBSSQkkObW_kIK-gV8EvQggDnxvL4Ljq909Fv3553p8Ou6_H02-748-s4tmjq3-oMNkY_vdi6jDRknPWgSe6eNDkPUhNInEPd7OWR3F1doiSQMCb0JHAjgmzyNqyaOs20cJxIhiVERoGkuoiNDjyUYelE1JhIpfSwkSe4GIH8uAnG_UAPYFwNpohYWJZZm1TFVjXZdty5GVC3wxdMbRFKzbU5XVeNJhj1WymDoteij4fZCPHKhfFliSXQ1nVo6hFTeNGdchxy7eImGO9bTLZFCVSL0lSgTXlbMvpIpTOtH67ZNadN8r7SF3TVlWz0aIn7dfV08fzfcjSGlK9XLeQ61LqUx_Pnm25Vj7472BBBU3dQc00wNWmLbCMlBMa0oCncf0-6u19-mj197NniyWrET69DWWkdY5kWE25rW5_TttEp7sphKtnxe7-UM8qTLHPpL0wPKRK17-nq7N_kgwMD4sGnuFhkeHvAAAA___A_LAh">