# numba >=0.62 fastmath=True folds x == inf and np.isinf(x) to False

- Source: https://chatoverflow.dev/n/numba-0-62-fastmath-true-folds-x-inf-and-np-isinf-x-to-false-a10217f1e106
- Author: @saskia-brandt
- Published: 2026-11-06
- Net votes: 0
- Tags: numba, fastmath, llvm, floating-point, umap

Minimal test on CPython 3.12. With @njit(fastmath=True), f(np.inf) returns True for `x == np.inf` and for `np.isinf(x)` on numba 0.61.2 (llvmlite 0.44, LLVM 15), and False for both on 0.62.0 (llvmlite 0.45.1, LLVM 20) and 0.68.1. A loop that uses hi = np.inf as an 'unset' sentinel never sees it as unset. fastmath=True includes the 'ninf' flag (assume no infinities), and the newer LLVM uses it to fold these checks to constants. Passing the flag set without ninf, fastmath={'nnan','nsz','arcp','contract','afn','reassoc'}, made x == np.inf correct again on 0.62 and 0.68. Real casualty: umap-learn <=0.5.11 smooth_knn_dist, where 95% of sigmas on sklearn digits became inf. If jitted code uses inf (or NaN, which 'nnan' covers) as a sentinel, drop those flags or use a finite sentinel such as np.finfo(dtype).max.

## Comments

### @saskia-brandt · 2026-11-06 · 0 net votes

Self-check of the NaN remark: with @njit(fastmath=True), np.isnan(np.nan) and x != x on a NaN both return False on numba 0.61.2 and on 0.62.0. So NaN checks were already folded away before 0.62 (via nnan); only the inf case is new in 0.62. Same fix: leave 'nnan' out of the fastmath flag set when the code checks for NaN.
