当前位置: 首页 > news >正文

【libm】 16 IEEE 754-2019 maximum 函数实现(fmaximum_num.rs)

一、源码

这段代码实现了一个符合 IEEE 754-2019 标准的 maximumNumber 函数,用于计算两个浮点数的最大值,但与普通的 maximum 函数相比,它对 NaN 的处理略有不同。

/* SPDX-License-Identifier: MIT OR Apache-2.0 */
//! IEEE 754-2019 `maximumNumber`.
//!
//! Per the spec, returns:
//! - `x` if `x > y`
//! - `y` if `y > x`
//! - Non-NaN if one operand is NaN
//! - Logic following +0.0 > -0.0
//! - Either `x` or `y` if `x == y` and the signs are the same
//! - qNaN if either operand is a NaN
//!
//! Excluded from our implementation is sNaN handling.use super::super::Float;#[inline]
pub fn fmaximum_num<F: Float>(x: F, y: F) -> F {let res =if x.is_nan() || x < y || (x.to_bits() == F::NEG_ZERO.to_bits() && y.is_sign_positive()) {y} else {x};// Canonicalizeres * F::ONE
}

二、代码分析

  1. 许可证声明

/* SPDX-License-Identifier: MIT OR Apache-2.0 */
  • 代码使用 MIT 或 Apache-2.0 许可证。
  1. 文档注释

//! IEEE 754-2019 `maximumNumber`.
//!
//! Per the spec, returns:
//! - `x` if `x > y`
//! - `y` if `y > x`
//! - Non-NaN if one operand is NaN
//! - Logic following +0.0 > -0.0
//! - Either `x` or `y` if `x == y` and the signs are the same
//! - qNaN if either operand is a NaN
//!
//! Excluded from our implementation is sNaN handling.
  • 这是一个模块级文档注释,说明这个模块实现了 IEEE 754-2019 标准的 maximumNumber 函数。

  • 与 maximum 的区别:

    • 如果其中一个操作数是 NaN,而另一个不是,则返回非 NaN 的值(maximum 会返回 NaN)。

    • 如果 x == y 且符号相同,返回 x 或 y(实现可能选择任意一个)。

    • 仍然遵循 +0.0 > -0.0 的逻辑。

    • 如果两个操作数都是 NaN,返回 qNaN(静默 NaN)。

    • 不处理 sNaN(信号 NaN)。

  1. 导入依赖

use super::super::Float;
  • 从上级模块导入 Float trait,该 trait 定义了浮点数类型的基本操作和常量(如 NEG_ZERO)。
  1. 函数定义

#[inline]
pub fn fmaximum_num<F: Float>(x: F, y: F) -> F {
  • #[inline]:提示编译器将函数内联,以提高性能。

  • pub fn fmaximum_num<F: Float>(x: F, y: F) -> F:

    • 定义一个公共泛型函数 fmaximum_num,接受两个相同浮点数类型 F 的参数,返回一个 F 类型的值。

    • F 必须实现 Float trait。

  1. 函数实现
let res =if x.is_nan() || x < y || (x.to_bits() == F::NEG_ZERO.to_bits() && y.is_sign_positive()) {y} else {x};
  • 条件判断:

    • x.is_nan():

      • 如果 x 是 NaN,返回 y(即使 y 也是 NaN,此时返回 y,即 qNaN)。
    • x < y:

      • 如果 x 小于 y,返回 y。
    • x.to_bits() == F::NEG_ZERO.to_bits() && y.is_sign_positive():

      • 如果 x 是负零 (-0.0),并且 y 是正数(包括 +0.0),则返回 y(因为 +0.0 > -0.0)。
  • 否则:

    • 返回 x(即 x >= y 或 x 不是 NaN)。
  1. 规范化结果
// Canonicalizeres * F::ONE
  • 将结果乘以 F::ONE(即 1.0)进行规范化,确保结果的二进制表示是规范化的形式(例如,确保 NaN 的 payload 是规范的)。

三、总结

  1. 与 maximum 的区别:
  • maximum:如果任一操作数是 NaN,返回 NaN。

  • maximumNumber:如果只有一个是 NaN,返回非 NaN 的值;如果两个都是 NaN,返回 qNaN。

  1. 特殊处理:
  • 正确处理 +0.0 > -0.0。

  • 如果 x == y 且符号相同,返回 x 或 y(实现可能选择任意一个)。

  1. 规范化:
  • 确保返回值的二进制表示是规范的(例如,避免非规范的 NaN 表示)。

这个函数适用于需要更宽松的 NaN 处理逻辑的场景,例如某些数值计算库或编译器优化。

http://www.xdnf.cn/news/1092655.html

相关文章:

  • linux正向配置dns解析
  • 100个GEO基因表达芯片或转录组数据处理025.GSE248467
  • AI智能体记忆架构的革命:LangGraph中的分层记忆系统实现
  • JAVA观察者模式demo【设计模式系列】
  • 基于YOLOv11的CF-YOLO,如何突破无人机小目标检测?
  • 【WEB】Polar靶场 21-25题 详细笔记
  • Prometheus+Grafana+node_exporter监控linux服务器资源的方案
  • 分库分表之实战-sharding-JDBC绑定表配置实战
  • CTFHub————Web[信息泄露(目录遍历、PHPINFO)]
  • 1.4 洛谷入门一题单全解
  • Explain关键字
  • Markdown 语法规则
  • 什么是 AMR 格式?简鹿音频转换器轻松批量转换 AMR 为 MP3
  • PHP语法高级篇(一):日期时间处理和包含文件
  • LLaMA 学习笔记
  • 装配式建筑4.0:当房子像汽车一样被“智造”
  • 数据结构——深度优先搜索与广度优先搜索的实现
  • 人机协同的关键枢纽:软件工程3.0中对象模型与模型驱动的融合路径
  • VSCode配置Cline插件调用MCP服务实现任务自动化
  • langchain从入门到精通(四十一)——基于ReACT架构的Agent智能体设计与实现
  • 陶哲轩:数学界的莫扎特与跨界探索者
  • Lingo软件学习(一)好学爱学
  • Grafana容器化部署
  • 工业通讯网关在电子制造中的核心作用——从DeviceNet到Modbus TCP的智能转换
  • Vue响应式原理三:响应式依赖收集-类
  • 【Python】FastApi
  • 腾讯云COS,阿里云OSS对象存储服务-删除操作的响应码204
  • S7-1500——(一)西门子PLC编程从入门到精通4、SCL间接寻址
  • 项目进度受制于资源分配,如何动态调配资源
  • LeetCode 138题解 | 随机链表的复制