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

这篇具有很好参考价值的文章主要介绍了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();
        }
    }
}

 运行如图:

C#中对浮点数NaN,PositiveInfinity,NegativeInfinity的特殊处理,C#,浮点数,c#,NaN,正无穷,负无穷大文章来源地址https://www.toymoban.com/news/detail-798982.html

到了这里,关于C#中对浮点数NaN,PositiveInfinity,NegativeInfinity的特殊处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法

    字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合 示例: 如果需要,一个字符串变量可以包含多个单词: 示例: 在 C# 中,字符串实际上是一个对象,其中包含可以在字符串上执行某些操作的属性和方法。例如,可以使用 Length 属性找到字符串的长度: 示例

    2024年01月20日
    浏览(47)
  • 【Unity细节】transform.position assign attempt for ‘xxx‘ is not valid. Input position is { NaN, NaN, NaN

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 :unity细节和bug transform.position assign attempt for ‘xxx’ is not valid. Input position is { NaN, NaN, NaN }. UnityEngine.Transform:Translate (UnityEngine.Vector3) 代码中的坐标系被置空了——检查

    2024年02月13日
    浏览(39)
  • 部分安卓端ncnn模型推理输出数据存在大量-nan和nan的问题

    原文issue链接:部分安卓端ncnn模型推理输出数据存在大量-nan的问题 · Issue #3607 · Tencent/ncnn (github.com)         onnx、ncnn模型在pc端推理输出结果正确且基本一致,在部分安卓设备上使用同一模型和输入的推理输出数据正常,另一部分安卓端设备上存在大量-nan数值,且推理结

    2024年02月16日
    浏览(36)
  • Elasticsearch搜索出现NAN异常

    原因分析 Elasticsearch默认的打分,一般是不会出现异常的 之所以会出现NAN异常,往往是因为我们重新计算了打分,使用了function_score 核心原因是在function_score中,出现了计算异常,比如 0/0,比如log1p(x),x为负数等 真实案例分析 测试索引 搜索query示例 搜索异常返回值 搜索异常原

    2024年02月14日
    浏览(33)
  • JavaScript判断是否为NaN

    (旅行是最劳顿,最麻烦,叫人本相必现的时候。经过长期苦旅行而彼此不讨厌的人,才可以结交作朋友。——钱钟书) 相信你在实际开发中,经常遇到一下场景 业务中不可避免的有些字段是空值,但经过转换后会变为NaN值,而在js中NaN的类型无论怎么判断都是数字,并且奇

    2024年02月02日
    浏览(65)
  • uniapp_微信小程序_NaN

    isNaN() 函数用于检查一个值是否为 NaN。它接受一个参数,该参数可以是任何 JavaScript 数据类型,包括数字、字符串、对象等。如果参数是 NaN,或者不能被转换为数字,则 isNaN() 返回 true ;否则返回 false 。 在计算属性的时候有时候计算出来的值是无效的,显示NaN,页面上用户看

    2024年04月14日
    浏览(19)
  • MATLAB中删除矩阵或向量中Nan数据

    将A中NaN值去掉: B=A(~isnan(A)) 参考博客

    2024年02月13日
    浏览(36)
  • 【Python】ValueError: Input X contains NaN.

    在对kaggle的数据集Give Me Some Credit进行信用评分卡的制作过程中,出现了报错。这个报错是在第一部分数据预处理的过程中出现的,发生在利用随机森林模型预测对空缺数据进行填充。 这段报错的主要错误是:在输入的变量中出现了空缺值或极大值,导致数据在导入随机森林

    2024年02月13日
    浏览(34)
  • MATLAB矩阵操作1——删除全0列和nan列

    删除结果如下: 删除结果如下: 删除结果如下: 上述代码可以直接复制到MATLAB中使用,或者下载下面的CSDN资源来使用代码 https://download.csdn.net/download/qq_57971471/87630683

    2024年02月12日
    浏览(32)
  • 在python中怎么 判断一个值是否为Nan

    在 Python 中,可以使用 math.isnan() 或者 numpy.isnan() 来判断一个值是否为 NaN。 示例代码如下: 在上面的代码中,我们首先使用 float(‘nan’) 创建了一个 NaN 值,并使用 math.isnan() 判断它是否为 NaN。 另外,如果需要判断一个数组中的值是否为 NaN,则可以使用 numpy 库中的 isnan() 函

    2024年02月12日
    浏览(96)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包