C++11标准模板(STL)- 常用数学函数 - 分类及比较 - 对给定的浮点值分类(std::fpclassify)
常用数学函数
对给定的浮点值分类
std::fpclassify
| 定义于头文件 | ||
| #define fpclassify(arg) /* implementation defined */ | (C99 起) |
归类浮点值 arg 到下列类别中:零、非正规、正规、无穷大、 NaN 或实现定义类别。该宏返回整数值。
忽略 FLT_EVAL_METHOD :即使以多于参数类型的范围和精度对它求值,首先仍将它转换到其语义类型,然后分类基于该类型:正规的 long double 值可能在转换到 double 时变为非正规,而在转换到 float 时变为零。
参数
| arg | - | 浮点值 |
返回值
指明 arg 类别的 FP_INFINITE 、 FP_NAN 、 FP_NORMAL 、 FP_SUBNORMAL 、 FP_ZERO 或实现定义类型之一。
#define FP_NAN 0x0100
#define FP_NORMAL 0x0400
#define FP_INFINITE (FP_NAN | FP_NORMAL)
#define FP_ZERO 0x4000
#define FP_SUBNORMAL (FP_NORMAL | FP_ZERO)
可能实现
namespace GGX
{
using namespace std;
constexpr int
fpclassify(float __x)
{return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,FP_SUBNORMAL, FP_ZERO, __x);
}constexpr int
fpclassify(double __x)
{return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,FP_SUBNORMAL, FP_ZERO, __x);
}constexpr int
fpclassify(long double __x)
{return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,FP_SUBNORMAL, FP_ZERO, __x);
}template<typename _Tp>
constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,int>::__typefpclassify(_Tp __x)
{return __x != 0 ? FP_NORMAL : FP_ZERO;
}
}
调用示例
#include <iostream>
#include <cstdlib>
#include <typeinfo>
#include <cinttypes>
#include <cmath>
#include <math.h>
#include <tgmath.h>
#include <stdio.h>
#include <math.h>
#include <float.h>const char *show_classification(double x)
{//归类浮点值 arg 到下列类别中:零、非正规、正规、无穷大、 NaN 或实现定义类别。switch (std::fpclassify(x)){case FP_INFINITE:return "Inf";case FP_NAN:return "NaN";case FP_NORMAL:return "normal";case FP_SUBNORMAL:return "subnormal";case FP_ZERO:return "zero";default:return "unknown";}
}int main(void)
{std::cout << "show_classification(1.0/0.0) is " << show_classification(1 / 0.0) << std::endl;std::cout << "show_classification(0.0/0.0) is is " << show_classification(0.0 / 0.0) << std::endl;std::cout << "show_classification(DBL_MIN/2) is is " << show_classification(DBL_MIN / 2) << std::endl;std::cout << "show_classification(-0.0 is is) " << show_classification(-0.0) << std::endl;std::cout << "show_classification(1.0 is is) " << show_classification(1.0) << std::endl;std::cout << std::endl;std::cout << "std::fpclassify(1.0/0.0) is " << std::fpclassify(1 / 0.0) << std::endl;std::cout << "std::fpclassify(0.0/0.0) is is " << std::fpclassify(0.0 / 0.0) << std::endl;std::cout << "std::fpclassify(DBL_MIN/2) is is " << std::fpclassify(DBL_MIN / 2) << std::endl;std::cout << "std::fpclassify(-0.0) is " << std::fpclassify(-0.0) << std::endl;std::cout << "std::fpclassify(1.0) is " << std::fpclassify(1.0) << std::endl;std::cout << std::endl;std::cout << std::hex;std::cout << "std::fpclassify(1.0/0.0) is " << std::fpclassify(1 / 0.0) << std::endl;std::cout << "std::fpclassify(0.0/0.0) is is " << std::fpclassify(0.0 / 0.0) << std::endl;std::cout << "std::fpclassify(DBL_MIN/2) is is " << std::fpclassify(DBL_MIN / 2) << std::endl;std::cout << "std::fpclassify(-0.0) is " << std::fpclassify(-0.0) << std::endl;std::cout << "std::fpclassify(1.0) is " << std::fpclassify(1.0) << std::endl;std::cout << std::endl;printf("show_classification(1.0/0.0) is %s\n", show_classification(1 / 0.0));printf("show_classification(0.0/0.0) is %s\n", show_classification(0.0 / 0.0));printf("show_classification(DBL_MIN/2) is %s\n", show_classification(DBL_MIN / 2));printf("show_classification(-0.0) is %s\n", show_classification(-0.0));printf("show_classification(1.0) is %s\n", show_classification(1.0));std::cout << std::endl;return 0;
}
输出
show_classification(1.0/0.0) is Inf
show_classification(0.0/0.0) is is NaN
show_classification(DBL_MIN/2) is is subnormal
show_classification(-0.0 is is) zero
show_classification(1.0 is is) normalstd::fpclassify(1.0/0.0) is 1280
std::fpclassify(0.0/0.0) is is 256
std::fpclassify(DBL_MIN/2) is is 17408
std::fpclassify(-0.0) is 16384
std::fpclassify(1.0) is 1024std::fpclassify(1.0/0.0) is 500
std::fpclassify(0.0/0.0) is is 100
std::fpclassify(DBL_MIN/2) is is 4400
std::fpclassify(-0.0) is 4000
std::fpclassify(1.0) is 400show_classification(1.0/0.0) is Inf
show_classification(0.0/0.0) is NaN
show_classification(DBL_MIN/2) is subnormal
show_classification(-0.0) is zero
show_classification(1.0) is normal
相关文章:
C++11标准模板(STL)- 常用数学函数 - 分类及比较 - 对给定的浮点值分类(std::fpclassify)
常用数学函数 对给定的浮点值分类 std::fpclassify 定义于头文件 <math.h> #define fpclassify(arg) /* implementation defined */ (C99 起) 归类浮点值 arg 到下列类别中:零、非正规、正规、无穷大、 NaN 或实现定义类别。该宏返回整数值。 忽略 FLT_EV…...
报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
报错场景 使用npm run dev 报错 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm…...
OpenCV基本操作(python开发)——(7)实现图像校正
OpenCV基本操作(python开发)——(1) 读取图像、保存图像 OpenCV基本操作(python开发)——(2)图像色彩操作 OpenCV基本操作(python开发)——(3&…...
[项目] C++基于多设计模式下的同步异步日志系统
[项目] C基于多设计模式下的同步&异步日志系统 文章目录 [项目] C基于多设计模式下的同步&异步日志系统日志系统1、项目介绍2、开发环境3、核心技术4、日志系统介绍4.1 日志系统的价值4.2 日志系统技术实现4.2.1 同步写日志4.2.2 异步写日志 5、相关技术知识5.1 不定参…...
Vue常用的修饰符有哪些?
修饰符(Modifiers)是用于指定以特殊方式绑定或处理Vue事件或指令的特殊符号。 事件修饰符 .stop: 阻止时间继续传播,相当于调用event.stopPropagation() .prevent: 阻止默认事件,相当于调用event.preventDefault() .capture: 使…...
AnatoMask的分层图像编码器-解码器
方法思想 采用多尺度编码器-解码器主干: 在编码器中,把CT图像分解成不同大小的图像块,从这些图像块中提取特征在解码器中,重建被掩盖图像时,考虑图像块的空间关系 输入D(深度Depth)张H&#x…...
面向对象编程的核心特性:封装、继承、多态与抽象
封装(Encapsulation): 定义:封装是面向对象编程中的一个基本原则,它指的是将对象的状态(属性)和行为(方法)捆绑在一起,并对外隐藏对象的内部实现细节…...
ubuntu openmpi安装(超简单)
openmpi安装 apt update apt install openmpi-bin openmpi-common libopenmpi-dev安装到此完毕 测试一下,success !...
Python中的SQL数据库管理:SQLAlchemy教程
Python中的SQL数据库管理:SQLAlchemy教程 在Python应用程序中,操作数据库是常见的需求之一。而 SQLAlchemy 是一个功能强大的数据库管理库,它提供了Pythonic的接口来管理和查询SQL数据库。SQLAlchemy 兼具 ORM(对象关系映射&…...
LeetCode --- 421周赛
题目列表 3334. 数组的最大因子得分 3335. 字符串转换后的长度 I 3336. 最大公约数相等的子序列数量 3337. 字符串转换后的长度 II 一、数组的最大因子得分 数据范围足够小,可以用暴力枚举移除的数字,得到答案,时间复杂度为O(n^2)&#…...
简单了解前缀树/字典树(Trie树)C++代码
介绍Trie树 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。 前缀树也有一些其它的名称:字典…...
ubuntu安装与配置Nginx(2)
1. 配置 Nginx Nginx 的配置文件通常位于 /etc/nginx/nginx.conf,而虚拟主机的配置文件通常在 /etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/ 目录中。 在/etc/nginx/conf.d目录下新建xx.conf文件,配置文件, nginx -t 检查语法…...
Linux环境下Mongodb部署
文章目录 一、系统环境二、MongoDb安装添加MongoDB官方库安装MongoDB配置MongoDB 三、MongoDB常见操作四、MongoDB用户管理创建用户修改密码删除用户 五、启用安全控制六、备份与还原1. 备份2. 恢复 七、外部工具连接MongoDB 一、系统环境 CentOS Stream 9 64bit 二、MongoD…...
(九)JavaWeb后端开发——Servlet
目录 1.Servlet由来 2.Servlet快速入门 3.Servlet执行原理 4.Servlet生命周期 1.Servlet由来 在JaveEE API文档中对Servlet的描述是:可以运行在服务器端的微小程序,但是实际上,Servlet就是一个接口,定义了Java类被浏览器访问…...
【零售和消费品&家居用品】家庭门窗开闭状态安全监控系统源码&数据集全套:改进yolo11-DCNV2
改进yolo11-GhostDynamicConv等200全套创新点大全:家庭门窗开闭状态安全监控系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”…...
【JavaScript】axios 二次封装拦截器(接口、实例、全局)
学习 coderwhy 老师结合 ts 二次封装 axios 目录结构 config config\index.ts // export const BASE_URL "http://codercba.com:9002"; export const TIME_OUT 10000;// 1. 根据环境变量区分接口地址 // let BASE_URL: string; // if (process.env.NODE_ENV &qu…...
Linux_02 Linux常用软件——vi、vim
vi编辑器有三种主要模式,每种模式的功能和用途不同: 一、命令模式 (Command Mode): - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标,输入各种命令(如删除、复制、粘贴等)。 yy:…...
C++代码优化--要求或禁止在堆中产生对象
目录 1.引言 2.栈与堆区别 2.1. 栈(Stack) 2.2. 堆(Heap) 3.限制在堆上分配内存的好处 4.对象在栈上分配内存的方法 4.1. 使用RAII(资源获取即初始化) 4.2. 避免使用new和delete 4.3. 限制对象的生…...
MybatisPlus入门(六)MybatisPlus-空值处理
一、MybatisPlus-空值处理 1.1)问题引入: 在查询中遇到如下情况,有部分筛选条件没有值,如商品价格有最大值和最小值,商品价格部分时候没有值。 1.2)解决办法: 步骤一:新建查询实体…...
钉钉内集成第三方免密登录(Vue+.Net)
需要实现的效果就是在钉钉内点击应用能跳转到第三方网站并且免密登录 1.登录钉钉PC端管理后台 2.通过管理后台进去开发者后台 3.应用开发 创建H5微应用 4.应用创建成功后直接点权限管理全部授权 5.设置H5登录地址 6. 应用管理发布 至此需要配置的步骤全部已完成,…...
关于【进程池阻塞 + 子进程未回收问题】
续接上文:进程间通信(二):实现一个高可用的进程池-CSDN博客 目录 一、先看现象:两个核心问题 二、核心原因:文件描述符泄漏(管道读端没关干净) 1. 管道的核心规则回顾 2. 后果&a…...
惯性导航系统深度解析:从平台式到捷联式的技术演进与精度优化
1. 惯性导航系统的基本原理 想象一下你被蒙上眼睛放在一个陌生的城市里,只给你一个计步器和指南针,要求你记录自己的行走路线。这就是惯性导航系统(INS)工作的基本场景——它通过测量运动载体的加速度和角速度,像做数…...
s2-pro音色复用效果实测:同一参考音频在不同文本长度下的泛化能力
s2-pro音色复用效果实测:同一参考音频在不同文本长度下的泛化能力 1. 测试背景与目的 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,其核心亮点之一是支持通过参考音频复用音色。这项功能在实际应用中极为实用,比如: 企业…...
CoPaw代码生成能力展示:从自然语言描述到可运行Python脚本
CoPaw代码生成能力展示:从自然语言描述到可运行Python脚本 1. 开篇:当自然语言遇上代码生成 "能不能帮我写个Python脚本,把文件夹里的图片都转成灰度图?"这样的需求,现在可以直接说给CoPaw听。作为一款专注…...
YOLOv12模型训练技巧:解决类别不平衡与过拟合问题
YOLOv12模型训练技巧:解决类别不平衡与过拟合问题 训练一个表现优异的YOLOv12模型,就像培养一位顶尖的运动员。光有强大的天赋(模型架构)还不够,科学的训练方法(训练技巧)才是决定最终成绩的关…...
实战掌握Kohya_SS AI模型训练:从零基础到精通的完整指南
实战掌握Kohya_SS AI模型训练:从零基础到精通的完整指南 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss Kohya_SS是一款功能强大的开源AI模型训练工具,专为Stable Diffusion等扩散模型提供完整的图形化训…...
Janus-Pro-7B开源大模型教程:HuggingFace模型路径本地加载实操
Janus-Pro-7B开源大模型教程:HuggingFace模型路径本地加载实操 1. 引言 如果你正在寻找一个既能看懂图片,又能根据文字生成图片的AI模型,那么Janus-Pro-7B绝对值得你花时间了解一下。这个模型最近在开源社区里挺火的,因为它把“…...
单片机串口通信原理与应用详解
单片机串口通信技术详解1. 串口通信基础概念1.1 串行通信原理串行通信是一种仅使用一根接收线(RX)和一根发送线(TX)进行数据传输的通信方式。与并行通信相比,虽然传输速度较慢,但具有布线简单、成本低的优势。典型的串口通信系统包含三根基本信号线&…...
WuliArt Qwen-Image Turbo实战:用AI快速生成电商海报与社交媒体配图
WuliArt Qwen-Image Turbo实战:用AI快速生成电商海报与社交媒体配图 1. 引言:电商视觉内容的生产困境 在电商运营和社交媒体营销中,视觉内容的重要性不言而喻。一张吸引眼球的海报或配图,往往能带来更高的点击率和转化率。然而&…...
Wan2.2-T2V-A5B赋能电商:Java开发实现商品短视频自动生成
Wan2.2-T2V-A5B赋能电商:Java开发实现商品短视频自动生成 最近和几个做电商的朋友聊天,他们都在头疼同一个问题:商品短视频的制作。一个爆款商品,可能需要几十个不同角度、不同卖点的短视频,投放到抖音、快手、淘宝逛…...
