Tag: nan

何时使用NaN或+/-无限?

对于float和double , NaN , PositiveInfinity或NegativeInfinity有什么好处? 我们何时应该使用或避免它们? 如果有这样的常量,为什么float.Parse(“a”)抛出错误而不是返回float.NaN ? NaN与null什么不同? 为什么浮动类型甚至可以division by zero ?

C#中可空类型的替代方案

我正在编写处理一系列数字数据的算法,有时,系列中的值必须为空。 但是,由于此应用程序对性能至关重要,因此我避免使用可空类型。 我已经对这些算法进行了性能测试,专门比较了使用可空类型和非可空类型的性能,在最好的情况下,可空类型的速度慢了2倍,但往往差得多。 最常用的数据类型是double,目前所选的null替代是double.NaN。 但是我知道这不是NaN值的确切用途,所以我不确定这是否有任何问题,我无法预见,最佳做法是什么。 我有兴趣找出以下数据类型的最佳空替代品:double / float,decimal,DateTime,int / long(尽管其他数据类型非常受欢迎) 编辑:我想我需要澄清我对性能的要求。 数字数据的演出通过这些算法在几个小时的时间内处理。 因此,虽然例如10ms或20ms之间的差异通常是微不足道的,但在这种情况下它确实对所花费的时间产生了重大影响。

为什么微软希望不用NaN修复错误的Equals和GetHashCode实现?

在.NET Framework中,浮点类型( System.Double和System.Single )的Equals(object)和GetHashCode()的实现( override )是错误的 。 引用MSDN GetHashCode(object)规范 : 哈希函数必须具有以下属性: •如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。 但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值。 如果您使用不同的二进制表示forms获取两个NaN值,则两个对象在Equals方法下的比较相等,但哈希码(几乎总是)是不同的。 现在,Microsoft Connect 已报告此错误。 但他们为什么不解决这个问题? 修复很容易:要么让不同的NaN 不相等,要么选择一个固定的哈希码来返回任何NaN 。 修复不会破坏任何东西:今天的事情,当使用不同的NaN时,没有任何作用。 你能想出任何不解决这个问题的理由吗? 这是一个说明当前行为的简单示例: using System; using System.Collections.Generic; using System.Linq; static class Program { const int setSize = 1000000; // change to higher value if you want to waste even more memory const double oneNaNToRuleThemAll […]

如何在C#中更改NaN字符串表示?

我的程序将pointcloud保存到文件,其中每个pointcloud是来自System.Windows.Media.Media3D命名空间的Point3D[,] 。 这显示了输出文件的一行(用葡萄牙语): -112,644088741971;71,796623005014;NaN (Não é um número) 虽然我希望它(为了以后正确解析): -112,644088741971;71,796623005014;NaN 生成文件的代码块在这里: var lines = new List(); for (int rows = 0; rows < malha.GetLength(0); rows++) { for (int cols = 0; cols < malha.GetLength(1); cols++) { double x = coordenadas_x[cols]; double y = coordenadas_y[rows]; double z; if ( SomeTest() ) { z = alglib.rbfcalc2(model, x, […]

用NaN对双打数组进行排序

这是一个“你能解释这个”类型的问题,而不是其他任何问题。 我在工作中遇到了一个问题,我们在表中使用NaN值,但是当表被排序时,它以一种非常奇怪,奇怪的方式出现。 我认为NaN正在捣乱,所以我写了一个测试应用程序来判断这是否属实。 这就是我所做的。 static void Main(string[] args) { double[] someArray = { 4.0, 2.0, double.NaN, 1.0, 5.0, 3.0, double.NaN, 10.0, 9.0, 8.0 }; foreach (double db in someArray) { Console.WriteLine(db); } Array.Sort(someArray); Console.WriteLine(“\n\n”); foreach (double db in someArray) { Console.WriteLine(db); } Console.ReadLine(); } 结果如下: 之前: 4,2,NaN,1,5,3,NaN,10,9,8 后: 1,4,NaN,2,3,5,8,9,10,NaN 所以,是的,NaN有些如何使排序的数组以奇怪的方式排序。 引用弗莱; “为什么这些东西?”

测试浮点数NaN会导致堆栈溢出

C#,VS 2010 我需要确定浮点值是否为NaN。 使用测试NaN的浮点数 float.IsNaN(aFloatNumber) 堆栈溢出崩溃。 那样做 aFloatNumber.CompareTo(float.NaN). 以下不会崩溃,但它无用,因为它返回NaN,无论如何: aFloatNumber – float.NaN 搜索“堆栈溢出”会返回有关此网站的结果,而不是实际堆栈溢出的结果,因此我找不到相关的答案。 为什么我的应用程序在测试NaN时会进入堆栈溢出? 编辑:调用堆栈: 编辑:我的代码中显然有些东西:这句话: bool aaa = float.IsNaN(float.NaN); 在InitializeComponent()之后立即在应用程序的构造函数中正常工作; 在InitializeComponent()之后,在自定义控件的类的构造函数中正常工作; 但是在类中的事件处理程序中崩溃以进行自定义控件。 所以,这就是我在做的事情: 抽象自定义控件:公共抽象部分类ConfigNumberBaseBox:TextBox 有一个Validating事件处理程序ValidateTextBoxEntry ValidateTextBoxEntry在ConfigNumberBaseBox类中定义 inheritance自ConfigNumberBaseBox的自定义控件:public partial class ConfigTemperBox:ConfigNumberBaseBox 运行该应用程序 编辑完ConfigTemperBox控件后,将调用ValidateTextBoxEntry ValidateTextBoxEntry运行正常,直到遇到float.IsNaN 堆栈溢出 编辑: Debug.WriteLine()显示代码只执行一次:没有递归。 编辑: 这有效: float fff = 0F; int iii = fff.CompareTo(float.PositiveInfinity); 这崩溃了: float fff = 0F; int iii = […]

c#NaN比较Equals()和==之间的差异

看一下这个 : var a = Double.NaN; Console.WriteLine(a == a); Console.ReadKey(); 打印“假” var a = Double.NaN; Console.WriteLine(a.Equals(a)); Console.ReadKey(); 打印“真实”! 为什么打印“真实”? 由于浮点数规范,NaN的值不等于它自己! 所以似乎Equals()方法实现错误……我错过了什么?