Commit ab2149e
Fix IEEE 754 compliance for real number operations (#29)
Erlang's :math module raises ArithmeticError for overflow and domain
errors instead of returning IEEE 754 special values. This causes
downstream libraries (like Nx) to crash on valid inputs.
Fixes:
- exp(large): returns :infinity instead of crashing
- sinh(large): returns :infinity/:neg_infinity based on sign
- cosh(large): returns :infinity
- asin/acos outside [-1,1]: returns :nan instead of crashing
- acosh below 1: returns :nan
- atanh outside (-1,1): returns :nan
- atanh(1): returns :infinity, atanh(-1): returns :neg_infinity
- sqrt(negative): returns :nan instead of crashing
- pow(0, negative): returns :infinity instead of crashing
- divide(x, 0.0): returns :infinity/:neg_infinity/:nan per IEEE 754
- divide(x, -0.0): respects negative zero sign (OTP 27+ matching)
- cot(0): returns :infinity instead of crashing (1/tan(0) = 1/0)
- acot(0): returns pi/2 instead of crashing
- acsc(0): returns :infinity instead of crashing
- acsc(values < 1): returns :nan for domain errors
34 new tests covering all IEEE 754 edge cases.
All 169 tests pass (99 doctests + 70 tests).
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent 17344af commit ab2149e
2 files changed
+272
-12
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
576 | 576 | | |
577 | 577 | | |
578 | 578 | | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
579 | 588 | | |
580 | 589 | | |
581 | 590 | | |
| |||
779 | 788 | | |
780 | 789 | | |
781 | 790 | | |
782 | | - | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
783 | 797 | | |
784 | 798 | | |
785 | 799 | | |
| |||
882 | 896 | | |
883 | 897 | | |
884 | 898 | | |
885 | | - | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
886 | 905 | | |
887 | 906 | | |
888 | 907 | | |
| |||
1126 | 1145 | | |
1127 | 1146 | | |
1128 | 1147 | | |
1129 | | - | |
| 1148 | + | |
| 1149 | + | |
| 1150 | + | |
| 1151 | + | |
| 1152 | + | |
| 1153 | + | |
| 1154 | + | |
| 1155 | + | |
| 1156 | + | |
| 1157 | + | |
1130 | 1158 | | |
1131 | 1159 | | |
1132 | 1160 | | |
| |||
1243 | 1271 | | |
1244 | 1272 | | |
1245 | 1273 | | |
1246 | | - | |
| 1274 | + | |
| 1275 | + | |
| 1276 | + | |
| 1277 | + | |
| 1278 | + | |
1247 | 1279 | | |
1248 | 1280 | | |
1249 | 1281 | | |
| |||
1317 | 1349 | | |
1318 | 1350 | | |
1319 | 1351 | | |
1320 | | - | |
| 1352 | + | |
| 1353 | + | |
| 1354 | + | |
| 1355 | + | |
| 1356 | + | |
1321 | 1357 | | |
1322 | 1358 | | |
1323 | 1359 | | |
| |||
1452 | 1488 | | |
1453 | 1489 | | |
1454 | 1490 | | |
1455 | | - | |
| 1491 | + | |
| 1492 | + | |
| 1493 | + | |
| 1494 | + | |
| 1495 | + | |
1456 | 1496 | | |
1457 | 1497 | | |
1458 | 1498 | | |
| |||
1478 | 1518 | | |
1479 | 1519 | | |
1480 | 1520 | | |
1481 | | - | |
| 1521 | + | |
| 1522 | + | |
| 1523 | + | |
| 1524 | + | |
| 1525 | + | |
1482 | 1526 | | |
1483 | 1527 | | |
1484 | 1528 | | |
| |||
1592 | 1636 | | |
1593 | 1637 | | |
1594 | 1638 | | |
1595 | | - | |
| 1639 | + | |
| 1640 | + | |
| 1641 | + | |
| 1642 | + | |
| 1643 | + | |
| 1644 | + | |
| 1645 | + | |
1596 | 1646 | | |
1597 | 1647 | | |
1598 | 1648 | | |
| |||
1630 | 1680 | | |
1631 | 1681 | | |
1632 | 1682 | | |
1633 | | - | |
| 1683 | + | |
| 1684 | + | |
| 1685 | + | |
| 1686 | + | |
| 1687 | + | |
1634 | 1688 | | |
1635 | 1689 | | |
1636 | 1690 | | |
| |||
1703 | 1757 | | |
1704 | 1758 | | |
1705 | 1759 | | |
1706 | | - | |
| 1760 | + | |
| 1761 | + | |
| 1762 | + | |
| 1763 | + | |
| 1764 | + | |
| 1765 | + | |
1707 | 1766 | | |
1708 | 1767 | | |
1709 | 1768 | | |
| |||
1732 | 1791 | | |
1733 | 1792 | | |
1734 | 1793 | | |
1735 | | - | |
| 1794 | + | |
| 1795 | + | |
| 1796 | + | |
| 1797 | + | |
| 1798 | + | |
1736 | 1799 | | |
1737 | 1800 | | |
1738 | 1801 | | |
| 1802 | + | |
| 1803 | + | |
1739 | 1804 | | |
1740 | 1805 | | |
1741 | 1806 | | |
| |||
1798 | 1863 | | |
1799 | 1864 | | |
1800 | 1865 | | |
| 1866 | + | |
| 1867 | + | |
| 1868 | + | |
| 1869 | + | |
| 1870 | + | |
1801 | 1871 | | |
1802 | | - | |
| 1872 | + | |
| 1873 | + | |
| 1874 | + | |
| 1875 | + | |
| 1876 | + | |
1803 | 1877 | | |
1804 | 1878 | | |
1805 | 1879 | | |
| 1880 | + | |
| 1881 | + | |
1806 | 1882 | | |
1807 | 1883 | | |
1808 | 1884 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1017 | 1017 | | |
1018 | 1018 | | |
1019 | 1019 | | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + | |
| 1099 | + | |
| 1100 | + | |
| 1101 | + | |
| 1102 | + | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + | |
| 1108 | + | |
| 1109 | + | |
| 1110 | + | |
| 1111 | + | |
| 1112 | + | |
| 1113 | + | |
| 1114 | + | |
| 1115 | + | |
| 1116 | + | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
| 1122 | + | |
| 1123 | + | |
| 1124 | + | |
| 1125 | + | |
| 1126 | + | |
| 1127 | + | |
| 1128 | + | |
| 1129 | + | |
| 1130 | + | |
| 1131 | + | |
| 1132 | + | |
| 1133 | + | |
| 1134 | + | |
| 1135 | + | |
| 1136 | + | |
| 1137 | + | |
| 1138 | + | |
| 1139 | + | |
| 1140 | + | |
| 1141 | + | |
| 1142 | + | |
| 1143 | + | |
| 1144 | + | |
| 1145 | + | |
| 1146 | + | |
| 1147 | + | |
| 1148 | + | |
| 1149 | + | |
| 1150 | + | |
| 1151 | + | |
| 1152 | + | |
| 1153 | + | |
| 1154 | + | |
| 1155 | + | |
| 1156 | + | |
| 1157 | + | |
| 1158 | + | |
| 1159 | + | |
| 1160 | + | |
| 1161 | + | |
| 1162 | + | |
| 1163 | + | |
| 1164 | + | |
| 1165 | + | |
| 1166 | + | |
| 1167 | + | |
| 1168 | + | |
| 1169 | + | |
| 1170 | + | |
| 1171 | + | |
| 1172 | + | |
| 1173 | + | |
| 1174 | + | |
| 1175 | + | |
| 1176 | + | |
| 1177 | + | |
| 1178 | + | |
| 1179 | + | |
| 1180 | + | |
| 1181 | + | |
| 1182 | + | |
| 1183 | + | |
| 1184 | + | |
| 1185 | + | |
| 1186 | + | |
| 1187 | + | |
| 1188 | + | |
| 1189 | + | |
| 1190 | + | |
| 1191 | + | |
| 1192 | + | |
| 1193 | + | |
| 1194 | + | |
| 1195 | + | |
| 1196 | + | |
| 1197 | + | |
| 1198 | + | |
| 1199 | + | |
| 1200 | + | |
| 1201 | + | |
| 1202 | + | |
| 1203 | + | |
1020 | 1204 | | |
0 commit comments