Проблема при записи набора общих функций математического инструмента для массива f64 \ f32 \ i32 \ i64 - PullRequest
0 голосов
/ 25 октября 2019

Теперь я хочу написать набор общих математических функций для массива f64 \ f32 \ i32 \ i64

Некоторые функции просты в написании, например, функции сложения:

pub fn add_val<T: std::ops::Add<Output=T> + Copy>(val1: &[T; 2], val2: &[T; 2]) -> [T; 2]{
    [val1[0] + val2[0], val1[1] + val2[1]]
}

Но я столкнулся с некоторыми проблемами при реализации некоторых функций. Например, есть функция нормализации:

pub fn normalize(val: &[f64; 2], len: &f64) -> [f64; 2] {
  let real_length = (val[0] * val[0] + val[1] * val[1]).sqrt();
  if real_length == 0.0 { // fix: NaN when 0
    return [val[0], val[1]]
  } else {
    let scale = len / real_length;
    [val[0] * scale, val[1] * scale]
  }
}

это легко понять , ​​Теперь я хочу, чтобы она поддерживала больше типов данных.

Одна из моих попыток:

pub fn normalize<T: std::ops::Add<Output=T> + std::ops::Mul<Output=T> + std::ops::Div<Output=T> + std::convert::From<f32> + std::convert::Into<f32> + Copy + std::cmp::PartialEq>(val: &[T; 2], len: &T) -> [T; 2] {
    let pow_num: f32 = (val[0] * val[0] + val[1] * val[1]).into();
    let real_length: f32 = (pow_num).sqrt();
    if real_length == 0.0 { // fix: 不特判 0 可能会返回 NaN
        return [val[0], val[1]]
    } else {
        let scale = *len / T::from(real_length);
        [val[0] * scale, val[1] * scale]
    }
}

Это ошибка:

58 |     let c = normalize(&a, &3.0);
   |             ^^^^^^^^^ the trait `std::convert::From<f64>` is not implemented for `f32`
   |
   = help: the following implementations were found:
             <f32 as std::convert::From<i16>>
             <f32 as std::convert::From<i8>>
             <f32 as std::convert::From<u16>>
             <f32 as std::convert::From<u8>>
   = note: required because of the requirements on

Причина 1018 * для этой ошибки

Я также пытаюсь использовать as Но мне сказали, что только можнобыть использованным в примитивном типе。

Я обнаружил, что примитивная черта была удалена , поэтому я не знаю, как ее квалифицировать ...

Если у вас есть хорошие идеиЯ надеюсь, что вы можете поделиться со мной, большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...