{"record":{"id":"7c69f312dbd992ba","repo":"huggingface/candle","slug":"step-cannot-be-zero","errorCode":null,"errorMessage":"step cannot be zero","messagePattern":"step cannot be zero","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"candle-core/src/tensor.rs","lineNumber":501,"sourceCode":"    }\n\n    /// Creates a new 1D tensor with values from the interval `[start, end)` taken with a common\n    /// difference `step` from `start`.\n    ///```rust\n    /// use candle_core::{Tensor, Device};\n    /// let a = Tensor::arange_step(2.0, 4.0, 0.5, &Device::Cpu)?;\n    ///\n    /// assert_eq!(a.to_vec1::<f64>()?, &[2.0, 2.5, 3.0, 3.5]);\n    /// # Ok::<(), candle_core::Error>(())\n    /// ```\n    pub fn arange_step<D: crate::WithDType>(\n        start: D,\n        end: D,\n        step: D,\n        device: &Device,\n    ) -> Result<Self> {\n        if D::is_zero(&step) {\n            bail!(\"step cannot be zero\")\n        }\n        let mut data = vec![];\n        let mut current = start;\n        if step >= D::zero() {\n            while current < end {\n                data.push(current);\n                current += step;\n            }\n        } else {\n            while current > end {\n                data.push(current);\n                current += step;\n            }\n        }\n        let len = data.len();\n        Self::from_vec_impl(data, len, device, false)\n    }\n","sourceCodeStart":483,"sourceCodeEnd":519,"githubUrl":"https://github.com/huggingface/candle/blob/d5fee525bfde3273eb7c9b75fd2bc4937be867ca/candle-core/src/tensor.rs#L483-L519","documentation":"Tensor::arange_step generates a range from start to end with a given step; a step of zero would produce an infinite loop, so it is rejected up front with this bail. D::is_zero is checked before any data is generated.","triggerScenarios":"Calling Tensor::arange_step(start, end, 0., &dev) with a literal or computed step of zero, e.g. a step read from config/CLI that defaulted to 0 or was divided to 0.","commonSituations":"Config files where the 'step' field was left at 0 or missing and defaulted to zero; dynamic step computed as (end-start)/n where n was huge or start==end leading to 0.","solutions":["Pass a nonzero step, matching the sign of (end - start): positive for ascending ranges, negative for descending.","Validate user/config-supplied step values before calling arange_step.","Use Tensor::arange(start, end, &dev) if you just want unit steps."],"exampleFix":"// before\nlet t = Tensor::arange_step(0f32, 10., cfg.step, &dev)?; // cfg.step may be 0\n// after\nlet step = if cfg.step == 0. { 1. } else { cfg.step };\nlet t = Tensor::arange_step(0f32, 10., step, &dev)?;","handlingStrategy":"validation","validationCode":"if step == 0.0 {\n    return Err(anyhow!(\"arange_step requires nonzero step\"));\n}\nlet t = Tensor::arange_step(start, end, step, &dev)?;","typeGuard":null,"tryCatchPattern":"let t = Tensor::arange_step(start, end, step, &dev)\n    .map_err(|e| anyhow::anyhow!(\"bad arange step {step}: {e\"))?;","preventionTips":["Validate config/CLI-provided step values before use.","When step is derived as (end-start)/n, assert n > 0 and the quotient != 0.","Use Tensor::arange for unit-step ranges."],"tags":["arange","zero-division","range"],"backgroundTag":"invalid-argument-value","analyzedSha":"d5fee525bfde3273eb7c9b75fd2bc4937be867ca","analyzedAt":"2026-09-02T00:15:47.023Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}