C#中的浮点比较是确定性的吗?
如果将浮点数赋给一个变量,并将该变量赋给另一个变量,是否保证这两个变量的比较结果始终为true 考虑以下代码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时,我认为在
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舍入问题真的无法引起问题。