【libm】0库入口文件(lib.rs)

打印 上一主题 下一主题

主题 1499|帖子 1499|积分 4512

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、源码

lib.rs是libm(纯 Rust 实现的数学函数库)的入口文件。
  1. //! libm in pure Rust
  2. #![no_std]
  3. #![cfg_attr(intrinsics_enabled, allow(internal_features))]
  4. #![cfg_attr(intrinsics_enabled, feature(core_intrinsics))]
  5. #![cfg_attr(all(intrinsics_enabled, target_family = "wasm"), feature(wasm_numeric_instr))]
  6. #![cfg_attr(f128_enabled, feature(f128))]
  7. #![cfg_attr(f16_enabled, feature(f16))]
  8. #![allow(clippy::assign_op_pattern)]
  9. #![allow(clippy::deprecated_cfg_attr)]
  10. #![allow(clippy::eq_op)]
  11. #![allow(clippy::excessive_precision)]
  12. #![allow(clippy::float_cmp)]
  13. #![allow(clippy::int_plus_one)]
  14. #![allow(clippy::many_single_char_names)]
  15. #![allow(clippy::mixed_case_hex_literals)]
  16. #![allow(clippy::needless_late_init)]
  17. #![allow(clippy::needless_return)]
  18. #![allow(clippy::unreadable_literal)]
  19. #![allow(clippy::zero_divided_by_zero)]
  20. #![forbid(unsafe_op_in_unsafe_fn)]
  21. mod libm_helper;
  22. mod math;
  23. use core::{f32, f64};
  24. pub use libm_helper::*;
  25. pub use self::math::*;
复制代码

  • 文件注释
  1. //! libm in pure Rust
复制代码
//! 是模块级文档注释,说明这个库是一个纯 Rust 实现的 libm(数学函数库)。

  • 全局属性(#![…])
    #![no_std]


  • 声明该库不依靠 Rust 标准库(std),适用于嵌入式体系或无操纵体系的环境。
#![cfg_attr(intrinsics_enabled, ...)]


  • 条件编译:如果 intrinsics_enabled 特性启用,则答应使用内部特性(internal_features)和 core_intrinsics(编译器内置函数)。
  • 对 WASM 目标额外启用 wasm_numeric_instr(WASM 数字指令优化)。
#![cfg_attr(f128_enabled, feature(f128))]


  • 如果 f128_enabled 启用,则启用实验性的 f128(128 位浮点数)支持(Rust 尚未稳定此功能)。
#![cfg_attr(f16_enabled, feature(f16))]


  • 如果 f16_enabled 启用,则启用实验性的 f16(16 位浮点数)支持。

  • Clippy 忽略规则
  1. #![allow(clippy::assign_op_pattern)]
  2. #![allow(clippy::deprecated_cfg_attr)]
  3. ...
  4. #![allow(clippy::zero_divided_by_zero)]
复制代码


  • 禁用 Clippy(Rust 的代码风格查抄工具)的某些告诫,比方:

    • float_cmp:答应浮点数直接比较(数学库需要)。
    • unreadable_literal:答应长数字字面量(如 3.14159265358979323846)。
    • zero_divided_by_zero:答应 0.0 / 0.0(数学库需要处理 NaN)。


  • 安全限制
  1. #![forbid(unsafe_op_in_unsafe_fn)]
复制代码


  • 强制在 unsafe fn 中明确标志 unsafe 代码块(提高安全性)。

  • 模块声明
  1. mod libm_helper;
  2. mod math;
复制代码


  • 定义两个子模块:

    • libm_helper:可能包含辅助函数或宏。


  • math:核心数学函数实现(如 sin、sqrt)。
  • 导入依靠
  1. use core::{f32, f64};
复制代码


  • 从 core 库导入 f32 和 f64 类型(no_std 环境下替换 std 的浮点类型)。

  • 公开 API
  1. pub use libm_helper::*;
  2. pub use self::math::*;
复制代码


  • 将 libm_helper 和 math 模块的所有公共项(函数/类型)导出为库的公共 API。
二、关键点总结


  • 纯 Rust 实现:不依靠 std,恰当嵌入式或无 OS 环境。
  • 条件编译:支持 WASM、f16/f128 等实验性功能。
  • 数学函数:核心逻辑在 math 模块中实现(如 sin、exp)。
  • 安全优先:严格限制 unsafe 的使用。
三、示例:如何使用 libm

  1. use libm::{sqrt, sin};
  2. fn main() {
  3.     println!("sqrt(2.0) = {}", sqrt(2.0_f64)); // 1.4142135623730951
  4.     println!("sin(PI/2) = {}", sin(1.5707963267948966_f64)); // ~1.0
  5. }
复制代码
这个库的设计目标是在不依靠体系 libm 的环境下提供标准数学函数,同时保持高性能和安全性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表