C#中对浮点数NaN,PositiveInfinity,NegativeInfinity的特殊处理

NAN

NAN 整体意思为Not a Number 不是一个数,

NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。

EEE 754-1985中,用指数部分全为1、小数部分非零表示NaN。以32位IEEE单精度浮点数的NaN为例,按位表示即:S111 1111 1AXX XXXX XXXX XXXX XXXX XXXX,S为符号位,符号位S的取值无关紧要;A是小数部分的最高位( the most significant bit of the significand),其取值表示了NaN的类型:X不能全为0,并被称为NaN的payload;

NaN本质仍然是一个特殊的浮点数,即零除以零。

public const Single NaN = 0F / 0F;

而正无穷和负无穷为:

正无穷大PositiveInfinity:正数除以零,仍然是一个特殊浮点数

负无穷大NegativeInfinity:负数除以零,仍然是一个特殊浮点数

        public const Single PositiveInfinity = 1F / 0F;public const Single NegativeInfinity = -1F / 0F;

任何对NaN进行加减乘除,正弦、正切,幂计算都将反馈NaN,并不会抛出异常。我们在进行浮点数运算时,一定要特别注意对除以0的处理。

对NaN,无穷大等浮点数操作不会抛出异常,而是特殊处理

比如对一个数组长度为0的数组求平均值,注意要进行特殊处理:

            try{int[] testArray = new int[0];Console.WriteLine(testArray.Average());}catch (Exception ex) {Console.WriteLine($"异常类型【{ex.GetType()}】,异常信息【{ex.Message}】");}

返回NaN的运算

返回NaN的运算有如下三种:

  • 至少有一个参数是NaN的运算

  • 不定式

    • 下列除法运算:0/0、∞/∞、∞/−∞、−∞/∞、−∞/−∞

    • 下列乘法运算:0×∞、0×−∞

    • 下列加法运算:∞ + (−∞)、(−∞) + ∞

    • 下列减法运算:∞ - ∞、(−∞) - (−∞)

  • 产生复数结果的实数运算。例如:

    • 对负数进行开偶次方的运算

    • 对负数进行对数运算

    • 对正弦或余弦到达域以外的数进行反正弦或反余弦运算 [1]

测试程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NaN_Demo
{class Program{static void Main(string[] args){float nan = float.NaN;float posi = float.PositiveInfinity;float nega = float.NegativeInfinity;Console.WriteLine($"NaN进行比较:【{nan == nan}】");Console.WriteLine($"正无穷比较:【{posi == posi}】");Console.WriteLine($"负无穷比较:【{nega == nega}】");float x = posi - nega;Console.WriteLine(x);x = posi - nan;Console.WriteLine(x);Console.WriteLine(Math.Tan(nan));double d = Math.Sqrt(-4);Console.WriteLine($"获取负数的开平方:【{d}】");d = Math.Asin(2);Console.WriteLine($"获取不在[-1,1]的之间的反正弦:【{d}】");Console.WriteLine($"正数除以无穷大的结果:【{1F / posi}】");Console.WriteLine($"负数除以无穷大的结果:【{-1F / posi}】");Console.WriteLine($"  零除以无穷大的结果:【{0 / posi}】");Console.WriteLine($"无穷除以无穷大的结果:【{posi / posi}】");Console.WriteLine($"无穷除以无穷大的结果:【{posi / nega}】");Console.WriteLine("---------------获取NaN,无穷大的二进制表示---------------");byte[] bufferNaN = BitConverter.GetBytes(nan);byte[] bufferPosiInfinity = BitConverter.GetBytes(posi);byte[] bufferNegaInfinity = BitConverter.GetBytes(nega);Console.WriteLine($"非数字的字节序列为【{string.Join("\x20", bufferNaN.Select(element => element.ToString("X2")))}】");Console.WriteLine($"正无穷的字节序列为【{string.Join("\x20", bufferPosiInfinity.Select(element => element.ToString("X2")))}】");Console.WriteLine($"负无穷的字节序列为【{string.Join("\x20", bufferNegaInfinity.Select(element => element.ToString("X2")))}】");Console.WriteLine();Console.WriteLine($"字节序列转化为浮点数结果为【{BitConverter.ToSingle(bufferNaN, 0)}】");Console.WriteLine($"字节序列转化为浮点数结果为【{BitConverter.ToSingle(bufferPosiInfinity, 0)}】");Console.WriteLine($"字节序列转化为浮点数结果为【{BitConverter.ToSingle(bufferNegaInfinity, 0)}】");try{int[] testArray = new int[0];Console.WriteLine(testArray.Average());}catch (Exception ex) {Console.WriteLine($"异常类型【{ex.GetType()}】,异常信息【{ex.Message}】");}Console.ReadLine();}}
}

 运行如图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读 Self-Supervised Burst Super-Resolution

这是一篇 ICCV 2023 的文章,主要介绍的是用自监督的方式进行多帧超分的学习 Abstract 这篇文章介绍了一种基于自监督的学习方式来进行多帧超分的任务,这种方法只需要原始的带噪的低分辨率的图。它不需要利用模拟退化的方法来构造数据,而且模…

API设计:从基础到最佳实践

1*vWvkkgG6uvgmJT8GkId98A.png 在这次深入探讨中,我们将深入了解API设计,从基础知识开始,逐步进阶到定义出色API的最佳实践。 作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解…

2024--Django平台开发-Django知识点(七)

频率超高的问题 Redis的问题虚拟环境mysqlcient和pymysql短信服务,一期用的是腾讯云短信 虚拟环境 可以用来创建虚拟环境的: virtualenv这个模块,简单易上手,推荐 小白不建议,conda,如果大家用这个&…

React项目实战--------极客园项目PC端

项目介绍:主要将学习到的项目内容进行总结(有需要项目源码的可以私信我) 关于我的项目的配置如下,请注意下载的每个版本不一样,写的api也不一样 一、项目介绍 1.资料 1)短信接收&M端演示&#xff1a…

Vue中v-if与v-show区别详解

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

寻找最富裕的小家庭 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭现给你一棵树,请计算出最富裕的小家庭的财富和。 输入描述 第一行为一个数N,…

关于tex中的表格设置

文章目录 控制表格列宽和行高控制表格列宽的同时实现居中tex中多表格排列单元格的合并与分割对单个单元格进行操作 控制表格列宽和行高 将下面的代码放在table环境内,放在tabular环境外 调整表格宽度和高度: \resizebox{\textwidth}{2cm}{%第一个{}是表…

C语言之从浅入深一步一步全方位理解指针【附笔试题】

文章目录 前言从浅入深理解指针《第一阶段》一、内存和地址1.1 内存1.2 究竟该如何理解编址 二、指针变量和地址2.1 取地址操作符(&) 三、指针变量和解引用操作符(*)3.1 指针变量3.2 如何拆解指针类型3.3 解引用操作符 四、指…

设计模式之解释器模式【行为型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

为了这口醋,包的这饺子。为了Selenium,学有限的CSS,逐步替换XPATH

Learn about CSS rules and pseudo-classes to help you move your XPATH locators to CSS. 1. 最基本IdElement TypeDirect ChildChild or Sub-ChildClass 2. 深入一点Next SiblingAttribute ValuesChoosing a Specific Match Sub-String Matches 3 参考资料 In order for Sel…

transfomer中Multi-Head Attention的源码实现

简介 Multi-Head Attention是一种注意力机制,是transfomer的核心机制. Multi-Head Attention的原理是通过将模型分为多个头,形成多个子空间,让模型关注不同方面的信息。每个头独立进行注意力运算,得到一个注意力权重矩阵。输出的结果再通过…

SVN切换账户

前言(svn切换) 本文章简单写下SVN账户切换操作 linux 1.删除目录 ~/.subversion/auth/ 下的所有文件。 2.再次操作svn时可重新输入用户名和密码。 windows (1)在工程中单击右键,单击"TortoiseSVN"。 (2)选择"Setting"。 (3)选择&quo…

C语言实现快排核心思想(双指针法)

核心代码: 这就是每一趟快排的实现代码,由上面的动图,我们能知道前后指针法的核心是玩好cur和prev这两个指针,具体的逻辑是cur找比key小的值,找到就prev,然后prev和cur的值就进行交换,但是总不能…

统信UOS操作系统上禁用IPv6

原文链接:统信UOS操作系统上禁用IPv6 hello,大家好啊!继之前我们讨论了如何在麒麟KYLINOS上禁用IPv6之后,今天我要给大家带来的是在统信UOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议,但在某些特定的网络环境…

PiflowX-DorisWrite组件

DorisWrite组件 组件说明 往Doris存储写入数据。 计算引擎 flink 组件分组 doris 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子fenodesFenodes“”无是Doris FE http地址, 支持多个…

基于企业级SaaS低代码平台的协同制造产品解决方案

万界星空科技低代码平台提供的MES,WMS,QMS等应用,是助力企业从数字化工厂向数字化企业升级的落地管道及载体,能帮助企业在数字化转型的过程中,实现制造企业与其供应链的协同制造。从订单发出、供应商确认、供应商生产、…

使用setdefault撰写文本索引脚本(出自Fluent Python案例)

背景介绍 由于我们主要介绍撰写脚本的方法,所以用一个简单的文本例子进行分析 a[(19,18),(20,53)] Although[(11,1),(16,1),(18,1)] ambiguity[(14,16)] 以上内容可以保存在一个txt文件中,任务是统计文件中每一个词(包括字母,数…

评估LLM在细胞数据上的实用性(2)-细胞层面的评估

本文衔接上一篇:评估LLM在细胞数据上的实用性(1)-基本概述 目录 定义参数和任务批次整合多模态整合细胞类型注释 细胞层面的评估批次整合多模态整合细胞类型注释 定义 我们考虑一个预训练LLM表示为 M ( x , θ ) M(x,\theta) M(x,θ),其基于单细胞数据…

RAG 评估框架 -- RAGAS

原文 引入 RAG(Retrieval Augmented Generation)的原因 随着ChatGPT的推出,很多人都理所当然直接用LLM当作知识库回答问题。这种想法有两个明显的缺点: LLM无法得知在训练之后所发生的事情,因此无法回答相关的问题存…

从零开始学习Python基础语法:打开编程大门的钥匙

文章目录 一、引言1.1 Python作为一种流行的编程语言的介绍1.2 Python的应用领域和适用性 二、为什么选择Python2.1 Python的简洁性和易读性2.2 Python的跨平台特性 三、Python在数据科学和人工智能领域的应用3.1 第一个Python程序3.1.1 Hello, World!:编写并运行你…