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

C++学习之C++中`std::fmax`和`std::max`的区别

C++中std::fmaxstd::max的区别

这两个函数都用于求最大值,但在C++中有重要区别:

1. 基本区别

特性std::maxstd::fmax
所属头文件<algorithm><cmath>
主要用途通用最大值比较专门为浮点数设计
参数类型任意可比较类型浮点类型(float/double/long double)
NaN处理可能产生未定义行为明确处理NaN情况

2. 详细说明

std::max (来自<algorithm>)

template< class T >
const T& max(const T& a, const T& b);
  • 通用最大值函数,适用于任何可比较类型
  • 如果参数是NaN,行为是未定义的(可能返回NaN或另一个参数)
  • 可以用于整数、浮点数、自定义类型等
  • 是模板函数,编译时确定类型

std::fmax (来自<cmath>)

double fmax(double x, double y);
float fmaxf(float x, float y);
long double fmaxl(long double x, long double y);
  • 专门为浮点数设计的最大值函数
  • 明确处理NaN:如果一个参数是NaN,返回另一个参数;如果两个都是NaN,返回NaN
  • 有类型特化版本(fmaxf, fmaxl)
  • 遵循IEEE 754浮点规范

3. NaN处理示例

#include <iostream>
#include <algorithm>
#include <cmath>
#include <limits>int main() {
double a = 1.5;
double nan = std::numeric_limits<double>::quiet_NaN();std::cout << "std::max(1.5, NaN): " << std::max(a, nan) << "\n";
std::cout << "std::fmax(1.5, NaN): " << std::fmax(a, nan) << "\n";std::cout << "std::max(NaN, NaN): " << std::max(nan, nan) << "\n";
std::cout << "std::fmax(NaN, NaN): " << std::fmax(nan, nan) << "\n";return 0;
}

可能输出:

std::max(1.5, NaN): nan
std::fmax(1.5, NaN): 1.5
std::max(NaN, NaN): nan
std::fmax(NaN, NaN): nan

4. 性能考虑

  • 对于非NaN情况,两者性能相当
  • std::max可能更适合模板编程和通用代码
  • std::fmax在涉及可能NaN的浮点运算时更安全

5. 使用建议

  • 使用std::max

  • 处理非浮点类型

  • 确定不会有NaN值

  • 需要模板通用性

  • 使用std::fmax

  • 处理浮点数且可能有NaN

  • 需要可预测的NaN处理行为

  • 编写数值计算代码

http://www.dtcms.com/a/273622.html

相关文章:

  • pytorch的介绍以及张量的创建
  • Java中三种重要的锁
  • spring boot 详解以及原理
  • 界面设计工具——MasterGo莫高设计
  • 【UE教程/进阶】Slate链式编辑原理
  • 解决echarts数据更新了图表不更新
  • GPU 降成本免运维,睿观 AI 助手选择函数计算
  • 打破信息壁垒!可视化如何让交通数据 “开口说话”
  • C#元组:从基础到实战的全方位解析
  • 人脸图像生成(DCGAN)
  • Qt数据库编程详解:SQLite实战指南
  • Vue 3 中父组件内两个子组件相互传参的几种方法
  • Vue 3 入门——自学习版本
  • DOM编程实例(不重要,可忽略)
  • 分享|2025年机器学习工程师职业技术证书报考指南
  • 论容器化 | 分析Go和Rust做医疗的后端服务
  • 在vue中使用Three.js渲染FBX模型
  • arcgis api for js 设置地图服务请求带有请求头信息
  • 录音实时上传
  • uniapp
  • Claude Code是什么?国内如何使用到Claude Code?附国内最新使用教程
  • 基于定制开发开源AI智能名片与S2B2C商城小程序的旅游日志创新应用研究
  • uniapp小程序tabbar跳转拦截与弹窗控制
  • Elasticsearch混合搜索深度解析(上):问题发现与源码探索
  • Excel 转 JSON by WTSolutions API 文档
  • 较为深入的了解c++中的string类(2)
  • MyBatis 从入门到实战:代理 Dao 模式下的 CRUD 全解析
  • Netplan 配置网桥(Bridge)的模板笔记250711
  • excel如何只保留前几行
  • 提示工程:解锁大模型潜力的核心密码