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; } }
关键修复点说明:
- 整除判断:用
val % i == 0替代浮点数除法和round判断,完全避免精度误差; - 平方根计算:用整数循环逐步逼近平方根上限,代替
f32::sqrt的转换; - 性能优化:增加偶数快速排除、只遍历奇数等逻辑,减少不必要的计算;
- 边界处理:补充了val=0、1、2等边界值的直接判断,避免无效循环。
内容的提问来源于stack exchange,提问作者Tytanium
相关产品推荐
相关产品推荐

