首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Rayon检测整数和的溢出?

如何使用Rayon检测整数和的溢出?
EN

Stack Overflow用户
提问于 2018-07-29 03:02:59
回答 1查看 79关注 0票数 0

有没有一种方法可以检测到人造丝中的溢出,并迫使它陷入恐慌,而不是出现无限循环?

代码语言:javascript
复制
extern crate rayon;

use rayon::prelude::*;

fn main() {
    let sample: Vec<u32> = (0..50000000).collect();
    let sum: u32 = sample.par_iter().sum();

    println!("{}",sum );
}

Playground

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-29 03:45:05

您正在寻找ParallelIterator::try_reduce。文档示例实现了您想要的功能(甚至更多):

使用rayon::prelude::*;//计算平方和,小心溢出。fn sum_squares>(iter: I) -> Option { iter.into_par_iter() .map(|i| i.checked_mul(i)) //每一项,.try_reduce(|| 0,i32::checked_add) //并相加!} assert_eq!(sum_squares(0..5),Some(0 +1+4+9+ 16));//求和可能溢出assert_eq!(sum_squares(0..10_000),None);//或者平方甚至在到达try\_reduce assert_eq之前就溢出!(sum_squares(1_000_000..1_000_001),None);

特别针对您的示例:

代码语言:javascript
复制
extern crate rayon;

use rayon::prelude::*;

fn main() {
    let sample: Vec<u32> = (0..50000000).collect();
    let sum = sample
        .into_par_iter()
        .map(Some)
        .try_reduce(
            || 0, 
            |a, b| a.checked_add(b)
        );

    println!("{:?}", sum);
}

collect是不必要的低效的,但我暂时不去管它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51574380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档