You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust质数计算脚本在16777213处无响应,求解决方案

质数计算到16777213时冻结的问题修复

你的代码冻结的核心原因是依赖f32进行整数运算导致的精度丢失。16777213接近f32的精确整数表示上限(2^24=16777216),此时浮点数的精度误差会干扰循环范围计算或整除判断逻辑,引发异常的执行行为。

修复方案:用纯整数运算替代浮点数操作

彻底抛弃浮点数转换,改用整数运算实现质数判断,从根源上避免精度问题:

fn half(val: i128) -> bool {
    if val <= 1 {
        return false;
    }
    // 遍历2到val/2,用取模判断整除
    for i in 2..=val/2 {
        if val % i == 0 {
            return false;
        }
    }
    true
}

fn root(val: i128) -> bool {
    if val <= 1 {
        return false;
    }
    if val == 2 {
        return true;
    }
    // 偶数直接排除
    if val % 2 == 0 {
        return false;
    }
    // 用整数循环计算平方根上限,避免浮点数误差
    let mut sqrt_val = 1;
    while sqrt_val * sqrt_val <= val {
        sqrt_val += 1;
    }
    // 只遍历奇数,减少计算量
    for i in (3..sqrt_val).step_by(2) {
        if val % i == 0 {
            return false;
        }
    }
    true
}

fn is_prime(val: i128) -> bool {
    match val {
        0 | 1 => false,
        2 => true,
        _ if val <= 100 => half(val),
        _ => root(val),
    }
}

fn main() {
    let mut i: i128 = 16_700_000;
    loop {
        if is_prime(i) {
            println!("{}", i);
        }
        i += 1;
    }
}

关键修复点说明:

  1. 整除判断:用val % i == 0替代浮点数除法和round判断,完全避免精度误差;
  2. 平方根计算:用整数循环逐步逼近平方根上限,代替f32::sqrt的转换;
  3. 性能优化:增加偶数快速排除、只遍历奇数等逻辑,减少不必要的计算;
  4. 边界处理:补充了val=0、1、2等边界值的直接判断,避免无效循环。

内容的提问来源于stack exchange,提问作者Tytanium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:35:09