isnan函数、isinf函数c语言实现

isnan函数c语言实现

在C语言中,isnan 函数是 <math.h> 的一部分,用于检查一个浮点数是否是NaN(Not a Number)。然而,如果你想要了解或实现一个类似 isnan 的函数而不使用 <math.h>,你需要直接操作浮点数的位表示。这通常涉及到将浮点数视为一个整数(或一系列整数,对于双精度浮点数),并检查特定的位模式。

在IEEE 754标准中,NaN的位模式具有特定的特征:指数字段(exponent field)全为1,而尾数字段(mantissa or fraction field)不为全0。但是,需要注意的是,存在多种NaN表示,包括静默NaN(quiet NaN)和信号NaN(signaling NaN),它们在尾数字段中有所不同。

以下是一个简单的、针对IEEE 754单精度浮点数(float)的 isnan 函数的实现示例。请注意,这个实现是特定于平台的,因为它依赖于浮点数的内存布局:

#include <stdint.h>  
#include <stdbool.h>  // 检查一个float是否为NaN  
bool my_isnan(float f) {  // 将float转换为uint32_t以便按位检查  uint32_t i = *(uint32_t*)&f;  // IEEE 754单精度NaN的位模式特征  // 指数位全为1(0x7F800000),尾数位不全为0  const uint32_t nan_mask = 0x7F800000;  const uint32_t quiet_nan_mask = nan_mask | 0x00400000; // 假设我们只关心静默NaN  // 检查是否为NaN  if ((i & nan_mask) == nan_mask && (i & ~quiet_nan_mask) != 0) {  // 这里我们只检查了是否为NaN,没有区分静默NaN和信号NaN  // 如果你只关心静默NaN,可以去掉 & ~quiet_nan_mask 的检查  return true;  }  // 如果不是NaN,返回false  return false;  
}  // 注意:上面的实现对于信号NaN和某些特殊的NaN值(如伪无穷大)可能不会返回true  
// 因为我们使用了quiet_nan_mask来过滤掉一些情况。如果你想要一个更宽泛的NaN检查,  
// 可以只使用nan_mask进行比较。  // 测试代码  
#include <stdio.h>  int main() {  float testValues[] = {3.14, -0.001, 0.0, -42.0, 0.0/0.0, sqrt(-1.0)}; // 注意:sqrt(-1.0)在C中通常不产生NaN  // 为了测试NaN,我们可以使用0.0/0.0来生成一个  float nanValue = 0.0/0.0;  printf("Testing %f: %s\n", nanValue, my_isnan(nanValue) ? "NaN" : "Not NaN");  // 注意:sqrt(-1.0)在标准C中会产生域错误,并不直接返回NaN  // 如果你想要测试sqrt产生的NaN,你需要在一个支持复数或特定环境的上下文中进行  return 0;  
}

请注意,上面的 my_isnan 函数实现中,我使用了 quiet_nan_mask 来尝试过滤掉一些非NaN的值,但这可能不是必要的,具体取决于你想要如何定义“NaN”。如果你只想要检查任何形式的NaN(包括信号NaN和静默NaN),你应该只使用 nan_mask 进行比较。

另外,请注意 sqrt(-1.0) 在标准C中并不直接产生NaN;它会导致运行时错误(除非你在一个支持复数运算的环境中)。为了测试NaN,我使用了 0.0/0.0 来生成一个。

isinf c语言实现

在C语言中,isinf 函数是标准库 <math.h> 的一部分,用于检查一个浮点数是否是无穷大(不管是正无穷大还是负无穷大)。然而,如果你想要了解或实现一个类似 isinf 的函数而不直接使用 <math.h> 中的实现,你需要直接操作浮点数的位表示。

以下是一个基于IEEE 754标准实现的 isinf 函数的简单示例,该示例适用于单精度浮点数(float)和双精度浮点数(double)。请注意,这个实现是特定于符合IEEE 754标准的平台的。

单精度浮点数(float)

#include <stdint.h>  
#include <stdbool.h>  bool isinf_float(float f) {  // 将float转换为uint32_t以便按位检查  uint32_t i = *(uint32_t*)&f;  // IEEE 754单精度无穷大的位模式特征  // 指数位全为1(0x7F800000),尾数位全为0  const uint32_t inf_mask = 0x7F800000;  const uint32_t nan_or_inf_mask = inf_mask | 0x007FFFFF; // 用来检查是否是NaN或Inf  // 检查是否为无穷大  // 首先排除NaN(因为NaN的指数位也全为1,但尾数位不全为0)  // 然后检查是否为无穷大  return (i & nan_or_inf_mask) == inf_mask;  
}

双精度浮点数(double)

对于双精度浮点数,你需要使用64位整数(uint64_t)来检查:

#include <stdint.h>  
#include <stdbool.h>  bool isinf_double(double d) {  // 将double转换为uint64_t以便按位检查  uint64_t i = *(uint64_t*)&d;  // IEEE 754双精度无穷大的位模式特征  // 指数位全为1(0x7FF0000000000000),尾数位全为0  const uint64_t inf_mask = 0x7FF0000000000000ULL;  const uint64_t nan_or_inf_mask = inf_mask | 0x000FFFFFFFFFFFFFULL; // 用来检查是否是NaN或Inf  // 检查是否为无穷大  // 排除NaN,然后检查是否为无穷大  return (i & nan_or_inf_mask) == inf_mask;  
}

 

请注意,在上述代码中,我使用了 ULL 后缀来确保 inf_mask 和 nan_or_inf_mask 常量被正确地视为无符号的64位整数。

这些函数将返回 true 如果传入的浮点数是一个无穷大值(不管是正的还是负的),否则返回 false。由于IEEE 754标准中正负无穷大的表示仅在符号位上有所不同,而这些函数并不检查符号位,因此它们不会区分正无穷大和负无穷大。如果你需要区分它们,你可以使用 signbit 函数(也在 <math.h> 中)来检查浮点数的符号。

signbit c语言实现

在C语言中,signbit 函数是标准库 <math.h> 的一部分,用于检查浮点数的符号位。然而,如果你想要自己实现一个类似 signbit 的函数而不直接使用 <math.h> 中的实现,你可以通过直接操作浮点数的位表示来检查符号位。

以下是一个基于IEEE 754标准实现的 signbit 函数的简单示例,该示例同时适用于单精度浮点数(float)和双精度浮点数(double)。请注意,这个实现是特定于符合IEEE 754标准的平台的。

单精度浮点数(float)

#include <stdint.h>  
#include <stdbool.h>  bool signbit_float(float f) {  // 将float转换为uint32_t以便按位检查  uint32_t i = *(uint32_t*)&f;  // IEEE 754单精度浮点数的符号位位于最高位(第31位)  const uint32_t sign_mask = 0x80000000;  // 检查符号位  return (i & sign_mask) != 0;  
}

双精度浮点数(double)

#include <stdint.h>  
#include <stdbool.h>  bool signbit_double(double d) {  // 将double转换为uint64_t以便按位检查  uint64_t i = *(uint64_t*)&d;  // IEEE 754双精度浮点数的符号位位于最高位(第63位)  const uint64_t sign_mask = 0x8000000000000000ULL;  // 检查符号位  return (i & sign_mask) != 0;  
}

 

在这两个示例中,我们首先将浮点数(float 或 double)的地址转换为指向无符号整数(uint32_t 或 uint64_t)的指针,然后通过解引用该指针来获取浮点数的位表示。然后,我们使用一个掩码(sign_mask)来提取符号位,并检查它是否为1(表示负号)。

请注意,这些函数仅返回浮点数的符号位的状态,而不考虑该数是否为NaN、无穷大或零。如果你想要一个更全面的分类函数,你可能需要实现一个像我之前提到的 classify_float 或 classify_double 函数,该函数结合了 signbitisinf 和 isnan(或类似的位检查逻辑)的功能。然而,请注意,isnan 函数通常也需要特定的实现,因为它不能直接通过位检查来可靠地确定一个数是否为NaN(特别是当NaN的表示不遵循IEEE 754标准时)。但在IEEE 754标准下,你可以通过检查指数位全为1且尾数位不全为0来识别NaN。

特此记录

anlog

2024年9月24日

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149861.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

html TAB切换按钮变色、自动生成table--使用函数优化结构

<!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 1px solid #ccc; padding: 1px; marg…

基于Springboot社区论坛JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

2024双11买什么东西比较好?2024双十一好物推荐

双十一各种爆款商品&#xff0c;打折商品非常多&#xff0c;容易让人挑花眼也容易落入消费主义的陷阱&#xff0c;买回家后发现并不实用&#xff0c;甚至可能是自己平常生活中根本用不上的东西&#xff01;即使是打折活动也要在购买前考虑一下自己是否需要&#xff0c;在日常生…

Android (rust) vulkan (JNI) 画一个三角形: VulkanSurfaceView 初始化

上文说到, vulkan 作为一种 GPU 编程接口标准, 具有很好的跨平台能力. 并且在 wayland (GNU/Linux) 成功使用 vulkan 绘制了一个三角形. 今天, 我们同样使用 vulkano (rust), 在 Android (手机) 也画一个三角形吧 ~ 本文的解决方案主要参考了 stackoverflow 的一篇文章 (链接…

ITU标准引领车内通讯新纪元

在现代汽车科技更迭的今天&#xff0c;车内通讯与免提通话系统的性能与稳定性成为了消费者购车时不可忽视的重要因素。随着国际电信联盟&#xff08;ITU&#xff09;一系列标准的推出&#xff0c;车内通讯体验正迈向新的高度。本文将深入探讨ITU-T P.1100、P.1110、P.1120、P.1…

PTA L1-070 吃火锅

L1-070 吃火锅&#xff08;15分&#xff09; 以上图片来自微信朋友圈&#xff1a;这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”&#xff0c;那就厉害了&#xff0c;我们的故事就开始了。 本题要求你实现一个程序&#xff0c;自动检查你朋友给你发来的信息…

Django 对数据库的增删改查

新增 使用方法&#xff1a;类模型.objects.create 类模型 from django.db import models# Create your models here. class Car(models.Model):user models.CharField(max_length200)plate_number models.CharField(max_length20)def __str__(self):return f{self.user} -…

论文 | Reframing Instructional Prompts to GPTk’s Language

作者&#xff1a;Swaroop Mishra, Daniel Khashabi, Chitta Baral, Yejin Choi, Hannaneh Hajishirzi 论文摘要&#xff1a;语言模型 (LM) 更容易遵循哪些类型的指令提示&#xff1f; 我们通过进行广泛的实证分析来研究这个问题&#xff0c;这些分析阐明了成功指令提示的重要特…

vs2019 当前不会命中断点,还没有为该文档加载任何符号

问题&#xff1a; 解决问题&#xff1a; 1.检查C/C中的调试信息格式&#xff1b; 2. 检查连接器中的生成调试信息&#xff1b; 3.我的错误是修改过调试中的 “命令”这项导致的&#xff0c;下图已经改回默认&#xff1b;

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例

需求&#xff1a;后端需要提供一个文章发布的接口&#xff0c;接口中需要先对文章内容进行如下校验&#xff0c;校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样&#xff0c;链条上有很多节点&#xff0c;节…

基于STM32设计的室内育苗环境管理系统(物联网)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】ESP8266-WIFI模块【2】MQ135传感器【4】DHT11传感器【5】B1750传感器 …

1. 值、类型与运算符

在计算机的世界里&#xff0c;只有数据。你可以读取数据、修改数据、创建新数据&#xff0c;但不能提及非数据的内容。所有这些数据都存储为长位序列&#xff0c;因此本质上是相似的。 位&#xff08;比特&#xff09;是任何类型的二值事物&#xff0c;通常被描述为0和1。在计算…

CORE Kestrel Web、InProcess、OutOfProcess、启动配置、读取配置文件

Kestrel 服务 ASP.NET Core是一个跨平台框架。 这意味着它支持在不同类型的操作系统&#xff08;例如Windows&#xff0c;Linux或Mac&#xff09;上开发和运行应用程序。 Kestrel是ASP.NET Core应用程序的跨平台Web服务器。 这意味着该服务器支持ASP.NET Core支持的所有平台和…

VIN码识别:提升汽车行业效率的智能解决方案

随着汽车行业的快速发展&#xff0c;汽车管理与服务的数字化需求日益增加。无论是汽车制造商、经销商、还是售后服务人员&#xff0c;都希望通过更便捷、高效的方式获取汽车的基本信息。在这样的背景下&#xff0c;VIN码识别接口成为了一种有效的智能解决方案。 什么是VIN码&am…

[笔记]某视觉三维定位系统参数表

表中的参数是彼此关联的&#xff0c;其实是就是视频解算的速度。里面的1秒直接对应1FPS300m秒直接对应3FPS0-20m的识别范围&#xff0c;与摄像头分辨率、视在焦距与摄像头基线有明确的对应关系。它的矩阵非正方。怀疑一组用于远距&#xff0c;一组用于近距&#xff0c;属于固定…

Redis系列补充:聊聊布隆过滤器(go语言实践篇)

1 介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是 Redis 4.0 版本之后提供的新功能&#xff0c;我们一般将它当做插件加载到 Redis Service服务器中&#xff0c;给 Redis 提供强大的滤重功能。 它是一种概率性数据结构&#xff0c;可用于判断一个元素是否存在于一个集…

Register Two Point Sets 注册两个点集

文章目录 Register Two Point Sets 注册两个点集Visualize Gradient Descent 可视化梯度下降Hyperparameter Search 超参数搜索JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4类说明 原文url: https://examples.itk.org/src/registration/metricsv4/registertwopointse…

2024/9/24有关1x1卷积核

深度学习笔记&#xff08;六&#xff09;&#xff1a;1x1卷积核的作用归纳和实例分析_1x1卷积降维-CSDN博客 从这篇文章写的很好&#xff0c;主要讲的就是1x1卷积核有降维作用&#xff0c;还有就是线性映射作用&#xff08;一般步进长度设置为的为1&#xff0c;也相当于是全连…

R包:ggspatial空间画图

ggplot2语法的空间图形画图 Spatial data plus the power of the ggplot2 framework means easier mapping. 加载R包 # install.packages("ggspatial")library(ggplot2) library(ggspatial) load_longlake_data()Using layer_spatial() and annotation_spatial() g…

Sql Developer期显示格式设置

默认时间格式显示 设置时间格式&#xff1a;工具->首选项->数据库->NLS->日期格式: DD-MON-RR 修改为: YYYY-MM-DD HH24:MI:SS 设置完格式显示&#xff1a;