Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的浮点比较是确定性的吗?_C#_.net_Clr - Fatal编程技术网

C#中的浮点比较是确定性的吗?

C#中的浮点比较是确定性的吗?,c#,.net,clr,C#,.net,Clr,如果将浮点数赋给一个变量,并将该变量赋给另一个变量,是否保证这两个变量的比较结果始终为true 考虑以下代码 var r = new Random(); float a = (float)r.NextDouble(); float b = a; Console.WriteLine(a == b); // Is this guaranteed to print true? 编辑:让我们假设值不能是NaN。如果a是NaN@vc74,则不会。问题的第一部分(和标题)更一般化。在生成NaN时,我认为在

如果将浮点数赋给一个变量,并将该变量赋给另一个变量,是否保证这两个变量的比较结果始终为true

考虑以下代码

var r = new Random();
float a = (float)r.NextDouble();
float b = a;
Console.WriteLine(a == b); // Is this guaranteed to print true?

编辑:让我们假设值不能是NaN。

如果
a
NaN
@vc74,则不会。问题的第一部分(和标题)更一般化。在生成
NaN
时,我认为在这种情况下不会发生这种情况
Double
float
有更大的空间(和更高的精度),但我相信抛出超出范围的值只会引发异常,而不会导致
NaN
。不管怎样,这都是毫无意义的
NextDouble()
始终在0和1之间,当从double转换为float时,额外的精度将被截断。有大量互联网帖子强烈警告不要测试浮点值是否相等。这不是保证。x86是故障点,a变量可能存储在FPU堆栈中,但抖动可能会迫使b变量溢出到内存中,从而将值从80位截断为64位或32位。在调试代码时,您永远不会看到出现错误,这只会发生在发布版本中。在第一个版本中,您永远不会看到出现错误,只有当您维护代码并且从未预料到它的时候。还有一个网上帖子:@HansPassant,通常是这样。但在这种特定情况下,x86舍入问题真的无法引起问题。