<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/163470>163470</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] No-zero result from `a*a - b*b` when a == b
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zhqrbitee
</td>
</tr>
</table>
<pre>
Hi,
For below codes,
```cpp
#include <iostream>
#include <cmath>
double test1(double a, double b) {
return (a*a - b*b) ;
}
int main() {
std::cout << "---------------------------------" << std::endl;
std::cout << test1(1.1, 1.1) << std::endl;
std::cout << "---------------------------------" << std::endl;
return 0;
}
```
If `a == b`, then I would expect the `test1` function return me exactly `0.0`, as `a * a` should be exactly equal to `b * b`. However, it always return me a small value in my MacBook (with M2 chips).
I compared the assembly codes from latest clang and GCC with `-O3` in compiler explorer (in arm64): both of them use fused multiply-add instructions, but the GCC one can produce 0.0 as expected, while the clang one produce `8.88178e-18`.
<img width="2559" height="882" alt="Image" src="https://github.com/user-attachments/assets/bffbe404-01dd-4e8d-a49a-0e7a794a7644" />
The compiler explorer link is: https://godbolt.org/z/93Tej6d66
I know floating-point issues can be subtle, but it seems returning 0.0 in this case makes more sense to me.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VcuS27gO_Rp6g5KLImU9Fl647eubXmRmkx-gSNhimg-Hj3bcXz9Fye5OJlOZ1bhcJQkED3AOAFLEqM8OcUs2T2RzWImcJh-2b9O3MOqEuBq9um0_acL2hO6OPsCIxl9BeoVxMZKWLn95uUD5Zlw7abJCIHyvfUwBhSX8f7-sSSvSdF-gO-XzaBASxlQT1t8_BWF7uL-PhA1AuidCdwAAAVMODgjrBWE7AVVx2C1OvDiR7rBAE7rTLoEV2hHW_4ASkyJ8R_hO-pxKSoTvgTBW_duPMPZwf8dAp8wS-J9xH8zqdV1IzY_hdygA_1mCH_LRn7R61LIU8vkEpKUCCD8QfoCxrLA9pAkdPMPVZ6MAv19QpmIrvgvDlsIpO5m0d48gFgG_C5nMrbjRNb1jiXgPwXYgysY4zbDjhz9-y8JA8sVxnB1LImv45K_4iqGg6ATCXMUt_hBOQLTCGHgVJiNoB_YGn4V88v6ldMxVpwk-M5CTvkTChvVMGKS3FxFQzYREjGhHc1uaHU7BWzCicARphDuDcAr-v9_DDEZaWv3JCwftZhxtMBR9jA8YSkztQATbNoQNhO9g9GkCfyqhLOSIcMoRFdhskr6YWyWUAu1iCnmWskwbjHnRukT1DkEKB5fgVZYIdE2LnktFUBX366TLRE14T7hsebiTlvbrvq-7Hqu6nyW9Dwvfa3uGq1ZlOA-EMbbZDKWfJtTnKS22vmfFJMz9-9mKMxZLDHKxTCldYmk8diTseNZpyuNaekvYMUcMlUhJyMmiS5GwYxF7fhlPpxEb2lS0VqpqsFeVaAZRUexENzSia5tmbm52fD86vhSGv0hutHsBXVIA-FsyXo3epLUPZ8KOb4QdB_4Fv7aqbRfAZ3hx_gon40XS7lxdfDk_dIwZ4yz6iBDzmAw-qqITRET7aEHtznNBtIM06bInIljxghGsDwgRXcTS1RbfdX_8V2rL1cAHscJt3bW06Rkf-Gratp3inHWdaKQacWQ1nqSStJfIRa_oZqW3jLJNTeuGsQ2v-bruO1aLTTPgidb9piENRSu0WRvzagv91cxpW7e86ejKiBFNnO8CxuaWIYyVayFsy4ZqzOdIGmp0TPEDIulk5gtk2bE5wB--esPgIWDMJi2TU-b8p2O6pXAtR8nHAbPKwWx_0zYl4v1RXYL_ijIRdlyqQtjxTuJ1y_4KAAD__8aaBXY">