Rust - sin(), cos(), log10() (flotante) no encontrado para el objetivo thumbv7em-none-eabihf

CorePress2024-01-25  11

Estoy usando Rust 1.51 y esta caja mínima:

#![no_std]

fn main() {
    let a = 2.0.cos();
}

Lo estoy compilando con cargo check --target thumbv7em-none-eabihf y el compilador se queja con este mensaje: no se encontró ningún método llamado 'cos' para el tipo '{float}' en el alcance actual. Lo mismo para sin() y log10().

Encontré https://docs.rust-embedded.org/cortex-m-quickstart/cortex_m_quickstart/ y esperaría el mensaje anterior para los objetivos thumbv6m-none-eabi o thumbv7em-none-eabi pero no para thumbv7em- none-eabihf que tiene soporte FPU.

¿Cómo puedo solucionar esto?

2

quieres usar la función estándar pero solicitas no incluirla. Hay un problema obvio en tu lógica

- Stargateur

28/03/2021 a las 10:05

1

github.com/rust-lang/rfcs/issues/2505

- Stargateur

28/03/2021 a las 10:11

gracias, no sabía que estos están solo en std pero no en core

-phip1611

28/03/2021 a las 10:21

1

Cree una respuesta propia cuando la resuelva. Creo que esa pregunta será útil para muchos futuros lectores.

- Stargateur

28/03/2021 a las 10:27



------------------------------------

Lo que dijo @phip1611 es correcto, porque ya no forma parte de la biblioteca principal y, por lo tanto, no se puede utilizar enno_std listo para usar. Puede usar libm directamente O mediante un contenedor estándar usando la caja num-traits con la función libm habilitada. Esto le permite escribir código no_std como lo haría con código estándar. Por ejemplo

# cargo.toml
num-traits = { version = "0.2", default-features = false, features = ["libm"] }

Y luego en tu código:

#![no_std]

#[allow(unused_imports)]
use num_traits::real::Real;

fn main() {
    let a = 2.0.cos();
}



------------------------------------

En Rust 1.51 (y versiones anteriores), funciones como sin, cos o log10 no forman parte de la biblioteca principal (core::) sino solo de la biblioteca estándar (std::), por lo que no están disponibles.

Una solución práctica es utilizar crate libm, que ofrece funciones matemáticas típicas para entornos no_std.

#![no_std]

fn main() {
    let a = libm::cosf(2.0);
}

Ver:

caja libm: https://crates.io/crates/libm Discusión para mover funciones matemáticas a la biblioteca principal https://github.com/rust-lang/rfcs/issues/2505

1

Sin embargo, tenga en cuenta que libm no contiene aceleración de hardware, incluso si la plataforma de destino la admite. Esto no es relevante para sin() o cos() para thumbv7em-none-eabihf, porque su FPU no los admite, pero, por ejemplo, abs() o sqrt() son compatibles y serán mucho más lentos con libm. . Puede encontrar más información en la discusión sobre rfc que ya está vinculada en la respuesta.

-Finomnis

31 de mayo de 2023 a las 10:04

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare