{"record":{"id":"793c8760526ac7ef","repo":"jax-ml/jax","slug":"passing-complex-start-stop-step-to-jnp-arange-is-n","errorCode":null,"errorMessage":"Passing complex start/stop/step to jnp.arange is no longer supported starting in JAX v0.10.0.","messagePattern":"Passing complex start/stop/step to jnp\\.arange is no longer supported starting in JAX v0\\.10\\.0\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/numpy/lax_numpy.py","lineNumber":5971,"sourceCode":"  # Ensure start/stop/step are scalars\n  for name, val in [(start_name, start), (\"stop\", stop), (\"step\", step)]:\n    if val is not None and np.ndim(val) != 0:\n      raise ValueError(f\"jax.numpy.arange: arguments must be scalars; got {name}={val}\")\n\n  # Handle symbolic dimensions\n  if any(core.is_symbolic_dim(v) for v in (start, stop, step)):\n    if stop is None:\n      start, stop = 0, start\n    if step is None:\n      step = 1\n    return _arange_dynamic(start, stop, step, dtype or dtypes.default_int_dtype())\n\n  if dtype is None:\n    dtype = dtypes.result_type(start, *(x for x in [stop, step] if x is not None))\n  dtype = dtypes.jax_dtype(dtype)\n\n  if iscomplexobj(start) or iscomplexobj(stop) or iscomplexobj(step):\n    raise ValueError(\n        \"Passing complex start/stop/step to jnp.arange is no longer supported\"\n        \" starting in JAX v0.10.0.\")\n\n  if stop is None:\n    start, stop = 0, start\n\n  if step is not None:\n    # arange(N, M, K)\n    if (dtype is not None and\n        dtypes.issubdtype(dtype, np.floating) and\n        dtypes.finfo(dtype).bits < 32):\n      working_dtype = np.dtype('float32')\n    else:\n      working_dtype = dtype\n    size = max(0, int(np.ceil((stop - start) / step)))\n    return lax.convert_element_type(\n        lax.add(lax.convert_element_type(start, working_dtype),\n                lax.mul(lax.convert_element_type(step, working_dtype),","sourceCodeStart":5953,"sourceCodeEnd":5989,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/numpy/lax_numpy.py#L5953-L5989","documentation":"Starting with JAX v0.10.0, complex-valued start/stop/step arguments to jnp.arange are rejected with this ValueError. Complex arange has ambiguous semantics and poor hardware support, so JAX removed it; users must construct complex ranges manually from real ones.","triggerScenarios":"jnp.arange(0, 5, 1+2j), or passing complex-typed start/stop computed from complex dtype promotions, e.g. arange over a complex endpoint after result_type of a complex array.","commonSituations":"Upgrading JAX past v0.10.0 breaks previously-working (or silently odd) complex arange calls; complex-valued signal generation code (phasors, complex exponent grids) that used arange directly.","solutions":["Build a real arange and convert: (jnp.arange(n) * step).astype(complex) or jnp.arange(n) * (1+2j)","Use jnp.linspace for complex endpoints: jnp.linspace(0, 5+0j, n) which supports complex dtypes","Generate complex values via explicit real+imag construction"],"exampleFix":"// before\nz = jnp.arange(0, 10, 1+0.5j)\n// after\nz = jnp.arange(0, 10) * (1+0.5j)","handlingStrategy":"validation","validationCode":"import jax.numpy as jnp\nassert not jnp.iscomplexobj(start) and not jnp.iscomplexobj(stop) and not jnp.iscomplexobj(step)","typeGuard":"def is_real_scalar(v) -> bool:\n    return np.ndim(v) == 0 and not np.iscomplexobj(v)","tryCatchPattern":null,"preventionTips":["Pin JAX version when upgrading codebases using complex arange","Construct complex ranges as real_range * complex_step"],"tags":["jax","arange","complex","breaking-change","v0-10"],"backgroundTag":"removed-api-behavior","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}