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

news2025/2/27 18:14:07

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.coloradmin.cn/o/1382693.html

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

相关文章

AI-图片转换绚丽动漫人物-UGATIT

​​​​​​ 🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​​​​…

代码随想录算法训练营第五天天| 总结数组专题

数组:二分查找、双指针(包括快慢指针)、滑动窗口、模拟 链表:双指针、三指针、虚拟头指针、复杂指针操作画图明确每一步(标好次序) 数组 代码随想录总结的很好,如下图。我再结合自己的一些理解…

当使用WSL下载运行Docker可视化界面的镜像,使用报错

Traceback (most recent call last): File “app.py”, line 345, in root tk.Tk() File “/usr/lib/python3.8/tkinter/init.py”, line 2270, in init self.tk _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) _tkinter.T…

java基础知识点系列——运算符(四)

java基础知识点系列——运算符(四) 算术运算符 运算符和表达式 运算符:对常量或者变量进行操作的符号表达式:用运算符把常量或者变量链接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表…

数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)

数据结构排序——计数排序和排序总结 现在常见算法排序都已讲解完成,今天就再讲个计数排序。再总结一下 文章目录 1.计数排序2.排序总结3.排序oj(排序数组)题目详情代码思路 1.计数排序 计数排序是一种非基于比较的排序算法,它通…

苹果电脑清理内存 怎么清理删不掉的软件

苹果电脑是很多人的首选,因为它有着优秀的性能和设计。但是,随着时间的推移,你可能会发现你的苹果电脑变得越来越慢,或者出现一些奇怪的问题。这可能是因为你的电脑内存不足,或者有一些删不掉的软件占用了你的空间和资…

谷粒商城-缓存使用分布式锁SpringCache(5天)

缓存使用 1.1.1 哪些数据适合放入缓存 即时性、 数据一致性要求不高的 访问量大且更新频率不高的数据(读多, 写少) 例如:电商类应用, 商品分类, 商品列表等适合缓存 本地缓存 使用Map进行本地缓存 本地缓存…

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

java编程解小学生一年级竞赛题

抖音教学视频 目录 1、题目三角形加起来为10 大纲 1、题目三角形加起来为10 连接:小学一年级数学竞赛练习题3套,有点难度! 第16题 此方法不是最优解,穷举法,比较暴力解决 主要给大家演示如何用编程去解决我们的实…

格密码基础:SIS问题的定义与理解

目录 一. 介绍 二. SIS问题定义 2.1 直观理解 2.2 数学定义 2.3 基本性质 三. SIS与q-ary格 四. SIS问题的推广 五. Hermite标准型 六. 小结 一. 介绍 short interger solution problem短整数解问题,简称SIS问题。 1996年,Ajtai首次提出SIS问…

Unity Shader 属性的定义

Unity Shader 属性的定义 什么是材质球 人的衣服 什么是shader 决定材质跟灯光的作用 Property 若是把shader看作class,那么Property就可以看成成员变量 属性定义的通用格式 Properites{ Property[Property…] } ep:定义一个int: name("dis…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包,旨在彻底改变构建和共享语言模型(LM)应用程序的方式。Chainlit可以创建用户界面(UI),类似于由OpenAI开发的ChatGPT用户界面,Chainlit可以开发类似…

基于TCP的全双工网络编程实践

首先我们先了解一下什么是全双工通信? 全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信相当于是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 TCP服务端代码: #includ…

最新地图下载器(支持切片和矢量数据下载)

一、应用背景 在当今数字时代,地图下载器成为了越来越多人的必备工具。地图下载器可以帮助人们在没有网络的情况下使用地图,也可以帮助人们快速下载大量地图数据,方便日常生活和旅行。本文将介绍地图下载器的基本功能及其在不同场景下的应用。…

RSIC-V“一芯”学习笔记(二)——Linux入门教程

文章目录 一、前言二、Busybox套件三、重要的追踪工具——strace四、Shell五、正则表达式六、重定向(多次输入测试时)七、一些组合命令八、自动化脚本九、学会查阅十、亲(yuan)近(li) bai du十一、不要逃避困难十二、重视小问题 一…

springboot集成jsp

首先pom中引入依赖包 <!--引入servlet--> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId> </dependency> <!--引入jstl标签库--> <dependency><groupId>javax.servle…

关闭免费版pycharm社区版双击shift时出现的搜索框

Pycharm 在双击 shift 的时候总是弹出搜索框&#xff0c;但作为中国玩家&#xff0c;经常需要双击 shift 循环切换中英文。这就很困恼。 下面就解决这个问题。单独关闭双击shift的功能。 步骤 1.左上角 File -> Settings 2. 如图&#xff0c;输入‘advan’ 找到高级设置&…

Tomcat解压打包文件和并部署

一、文件压缩和上传解压 1.本地打包好dist.tar.gz文件 2.通过xftp拖拽上传到知道文件夹下,或者通过命令: cp dist.tar.gz /path/to/destination/folder注:将dist.tar.gz复制到 /path/to/destination/folder文件夹下,该文件夹只是举个例子怎么复制和解压! 3.进入/path/…

基于TCP的半双工网络编程实践

首先我们先了解一下什么是半双工通信&#xff1f; 半双工数据传输允许数据在两个方向上传输&#xff0c;但是在某一时刻&#xff0c;只允许数据在一个方向上传输&#xff0c;它实际上是一种切换方向的单工通信。 TCP服务端代码&#xff1a; #include <stdio.h> #inclu…

AI手写数字识别(二)

理解代码 上文主要介绍了人工智能模型的集成过程。人工智能模型的正确集成&#xff0c;是我们案例中人工智能应用开发的核心步骤。但要让一个人工智能应用顺利地被使用&#xff0c;除了集成模型之外的一些工作也是必不可少的&#xff0c;比如处理输入的数据&#xff0c;进行界…