• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何用边界值做一个’for’循环,并作为浮点值来执行?

for-loop 来源:serge1peshcoff 6次浏览

我需要实现一个for循环,该循环从一个浮点数转到另一个浮点数。如何用边界值做一个’for’循环,并作为浮点值来执行?

我知道如何实现,在C类语言:

<code class="prettyprint-override">for (float i = -1.0; i < 1.0; i += 0.01) { /* ... */ } 
</code>

我也知道,在鲁斯特我可以指定使用step_by循环一步,这给了我我想要的,如果我有边界价值观和步为整数:

#![feature(iterator_step_by)] 

fn main() { 
    for i in (0..30).step_by(3) { 
     println!("Index {}", i); 
    } 
} 

当我这样做,浮点数,它会导致编译错误:

#![feature(iterator_step_by)] 

fn main() { 
    for i in (-1.0..1.0).step_by(0.01) { 
     println!("Index {}", i); 
    } 
} 

这里是编译输出:

<code class="prettyprint-override">error[E0599]: no method named `step_by` found for type `std::ops::Range<{float}>` in the current scope 
--> src/main.rs:4:26 
    | 
4 |  for i in (-1.0..1.0).step_by(0.01) { 
    |       ^^^^^^^ 
    | 
    = note: the method `step_by` exists but the following trait bounds were not satisfied: 
      `std::ops::Range<{float}> : std::iter::Iterator` 
      `&mut std::ops::Range<{float}> : std::iter::Iterator` 
</code>

我如何能实现这个循环中,锈?


===========解决方案如下:

如果你还没有,我请你读戈德堡的What Every Computer Scientist Should Know About Floating-Point Arithmetic。

与浮点的问题,是你的代码可以做200或201次迭代,这取决于循环的最后一个步骤是否结束是i = 0.99i = 0.999999(这仍然是< 1即使真的很近)。

为了避免这个脚枪,Rust不允许迭代f32f64的范围。相反,它强迫你使用积分步骤:

for i in -100..100 { 
    let i = i as f32 * 0.01; 
    // ... 
} 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)