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的最佳实践。 作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解…

Python DataFrame取行

文章目录 index区间取行列值区间条件取行(1)列值区间基本表达方式(2)多条件组合表达方式(3)函数条件表达方式 datafame接受的几个过滤函数(1)isin函数:(2) query函数&…

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

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

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

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

微信小程序 - 视图与逻辑 介绍

文章目录 视图与逻辑一、页面导航1、页面导航 - 声明式导航1.1 导航到tabBar页面1.2 导航到非tabBar页面1.3 后退导航 2、页面导航 - 编程式导航2.1 导航到tabBar页面2.2 导航到非tabBar页面2.3 后退导航 3、页面导航 - 导航传参3.1 声明式导航传参3.2 编程式导航传参3.3 在 on…

ZZULIOJ 1125: 上三角矩阵的判断

题目描述 编写程序&#xff0c;输入一个正整数n&#xff08;1<n<10&#xff09;和n阶方阵a中的元素&#xff0c;如果a是上三角矩阵&#xff0c;输出“YES”&#xff0c;否则&#xff0c;输出“NO”。 上三角矩阵即主对角线以下&#xff08;不包括主对角线&#xff09;的…

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

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

目标导向理论 : 一种高效,改变人做事精神状态,决定成事概率的行为方式

百科对目标导向理论的解释 目标导向理论是激励理论的一种。它是由豪斯提出来的&#xff0c;目标导向理论的基本出发点是要求领导者排除走向目标的障碍&#xff0c;使其顺利达到目标&#xff0c;在此过程中&#xff0c;给予职工满足多种多样需要的机会。 [1]   目标导向理论认…

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

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

关于tex中的表格设置

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

背包~~~~~~~~~3478:【例86.3】 完全背包问题

【题目描述】 设有n&#xfffd;种物品&#xff0c;每种物品有一个重量及一个价值。但每种物品的数量是无限的&#xff0c;同时有一个背包&#xff0c;最大载重量为M&#xfffd;&#xff0c;今从n&#xfffd;种物品中选取若干件(同一种物品可以多次选取)&#xff0c;使其重量…

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

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

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

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

合并多个大语言模型文件的方法

合并多个大语言模型文件的方法 1. 合并多个大语言模型文件的方法 1. 合并多个大语言模型文件的方法 运行下面命令&#xff0c; &#xff08;示例&#xff09;Linux and macOS: cat swallow-70b-instruct.Q6_K.gguf-split-* > swallow-70b-instruct.Q6_K.gguf && …

为了这口醋,包的这饺子。为了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…

mybatis核心配置文件介绍

mybatis核心配置文件 1. properties配置介绍 properties标签&#xff1a;加载外部的资源配置文件 ​ 属性&#xff1a;resource 指定要引入的配置文件路径 ​ 在核心配置文件中&#xff0c;通过&#xff1a;${key}方式引入外部配置文件的数据 jdbc.peroperties 的文件内容…

transfomer中Multi-Head Attention的源码实现

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

SVN切换账户

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

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

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