Rust 'для l oop' (конвертирование из c ++) - PullRequest
3 голосов
/ 20 апреля 2020

Попытка преобразовать это для l oop из c ++ в ржавчину, и мне трудно разобраться, так как я очень плохо знаком с синтаксисом Rust.

double sinError = 0;
for (float x = -10 * M_PI; x < 10 * M_PI; x += M_PI / 300) {
    double approxResult = sin_approx(x);
    double libmResult = sinf(x);
    sinError = MAX(sinError, fabs(approxResult - libmResult));
}

1 Ответ

6 голосов
/ 20 апреля 2020

Итерация по целым числам

Как уже указывал @trentcl, обычно лучше выполнять итерации по целым числам, а не по плавающим числам, чтобы предотвратить суммирование числовых ошибок:

use std::f32::consts::PI;

let mut sin_error = 0.0;

for x in (-3000..3000).map(|i| (i as f32) * PI / 300.0) {
    sin_error = todo!();
}

Просто замените todo!() с кодом, который вычисляет следующий sin_error.

Более функциональный способ

use std::f32::consts::PI;

let sin_error = (-3000..3000)
    .map(|i| (i as f32) * PI / 300.0)
    .fold(0.0, |sin_error, x| todo!());

В случае, если вам не нужны числовые ошибки или вы хотите перебрать что-то еще Вот еще несколько вариантов:

Используйте while l oop

Это не так приятно, но делает свою работу!

use std::f32::consts::PI;

let mut sin_error = 0.0;
let mut x = -10.0 * PI;

while (x < 10.0 * PI) {
    sin_error = todo!();
    x += PI / 300.0;
}

Создайте свой итератор с successors()

Функция successors() создает новый итератор, где каждый последующий элемент вычисляется на основе предыдущего:

use std::f32::consts::PI;
use std::iter::successors;

let mut sin_error = 0.0;

let iter = successors(Some(-10.0 * PI), |x| Some(x + PI / 300.0));

for x in iter.take_while(|&x| x < 10.0 * PI) {
    sin_error = todo!();
}

Более функциональный способ

use std::f32::consts::PI;
use std::iter::successors;

let sin_error = successors(Some(-10.0 * PI), |x| Some(x + PI / 300.0))
   .take_while(|&x| x < 10.0 * PI)
   .fold(0.0, |sin_error, x| todo!());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...