为什么NaN值的比较与所有其他值的行为不同?也就是说,与运算符==,<=,> =,<,>的所有比较(其中一个或两个值为NaN)返回false,这与所有其他值的行为相反.
我想这可以通过某种方式简化数值计算,但我找不到明确说明的理由,甚至在Kahan 的IEEE 754状态讲义中也没有详细讨论其他设计决策.
这种异常行为在进行简单数据处理时会造成麻烦.例如,当在C程序中对某些实值字段的记录列表进行排序时,我需要编写额外的代码来处理NaN作为最大元素,否则排序算法可能会变得混乱.
编辑: 迄今为止的答案都认为比较NaNs毫无意义.
我同意,但这并不意味着正确的答案是错误的,而是一个非布尔值(NaB),幸运的是它不存在.
因此,在我看来,选择返回真或假的比较是任意的,对于一般数据处理,如果它遵循通常的定律(==的反射性,<= =,>的三分法),那将是有利的,以免数据结构依赖这些法律变得困惑.
因此,我要求打破这些法律的一些具体优势,而不仅仅是哲学推理.
编辑2: 我想我现在理解为什么使NaN最大化是一个坏主意,它会搞砸上限的计算.
可能需要NaN!= NaN以避免检测环路中的收敛,例如
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
Run Code Online (Sandbox Code Playgroud)
然而,最好通过比较绝对差异与小限制来编写.所以恕我直言,这是打破NaN反身性的一个相对弱的论据.
我四处寻找,但找不到答案.说我有这个代码:
class Command<T> : ICommand<T>
{
public void Execute(T parameter)
{
var isNull = parameter == null;
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
T可以是任何阶级,甚至是Nullable<>.如果T是值类型,执行上面的检查会导致装箱吗?我的理解是,这与调用ReferenceEquals两个object参数相同T,如果我理解正确的话,其中任何一个都会导致拳击,如果是值类型.
如果以上确实导致拳击,是否有更优选的方法来做到这一点而不会导致框发生?我知道有,default(T)但在int那种情况下0,我正在寻找这个值是否null没有拳击它.另外,我希望以满足值和引用类型的方式执行此操作.
我是C#的新手(我来自Java),我有以下疑问.
在我工作的应用程序中,我在代码中找到了类似的东西:
if (!String.IsNullOrEmpty(u.nome))
Run Code Online (Sandbox Code Playgroud)
此代码只是检查u对象的nome字段是否不是空的\null字符串.
好的,这对我来说非常清楚,但如果字段不是字符串但是正常的int,我该怎么做才能检查它?