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

C++11标准模板(STL)- 常用数学函数 - 分类及比较 - 对给定的浮点值分类(std::fpclassify)

常用数学函数

对给定的浮点值分类

std::fpclassify

定义于头文件 <math.h>

#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


http://www.mrgr.cn/news/64177.html

相关文章:

  • 【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理
  • Linux Kernel Programming (个人读书笔记)
  • 异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)
  • 8051汇编执行RET函数返回后总是复位到ORG 00H的位置,问题如何解决?
  • Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台
  • 计算机网络(Ⅵ)应用层原理
  • 食堂采购系统源码:实现供应链管理平台功能模块的技术实践
  • 5G学习笔记三之物理层、数据链路层、RRC层协议
  • 笔记整理—linux驱动开发部分(4)驱动框架
  • 一篇文章带你快速理解MySQL中的内连接和外连接
  • 如何避免使用锁时出现的死锁问题?
  • leetcode35.搜索插入位置
  • 锁原理和使用
  • Python自动化运维:技能掌握与快速入门指南
  • 绿色积分如何结合商家联盟?打造线上线下消费生态
  • MMSegmentation测试阶段推理速度非常慢的一种可能原因
  • 优先级队列(PriorityQueue)
  • Visual Studio 2019下载安装使用教程
  • Php实现钉钉OA一级审批,二级审批
  • 河南省教育厅办公室关于举办2024年河南省高等职业教育技能大赛的通知
  • electron + vue 打包完成后,运行提示 electrion-updater 不存在
  • 最小支撑树MST
  • 数据结构-复杂度
  • phcharm贪吃蛇小游戏后续一(代码1,2,3前文已发)
  • CesiumJS 案例 P18:检测文本、删除所有文本、隐藏与显示文本、改变文本
  • 二维码中怎么存入文件?文件二维码活码的3步制作技巧