我知道使用==检查浮点变量的相等性不是一个好方法。但我只想通过以下陈述来了解这一点:
float x = ...
float y = x;
assert(y == x)
Run Code Online (Sandbox Code Playgroud)
既然y是从 复制的x,那么这个断言是真的吗?
只是出于好奇.
typeof NaN数字似乎不合逻辑.顺便说一句,就像NaN === NaN或NaN == NaN返回虚假一样.这是javascript的特点之一,还是有理由这样做?
编辑:谢谢你的回答.尽管让人们感到高兴并不容易.阅读答案和维基我理解得更多,但仍然是一句话
与NaN进行比较时,即使与自身进行比较,也会返回无序结果.比较谓词是信令或非信令,信令版本表示这种比较的无效例外.等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.
只是让我头晕目眩.如果有人能用人类(而不是数学家)的可读语言翻译,我会感激不尽.
相关的IEEE标准定义了一个数字常量NaN(不是数字),并规定NaN应该比较为不等于它自己.这是为什么?
我熟悉的所有语言都实现了这个规则.但它经常会导致严重的问题,例如当NaN存储在容器中时,NaN存在于正在排序的数据中等时的意外行为等.更不用说,绝大多数程序员都希望任何对象都等于自身(在他们了解NaN之前,令人惊讶的是他们增加了错误和混乱.
IEEE标准经过深思熟虑,因此我确信NaN的比较与其本身相同是很糟糕的.我只是想不通它是什么.
PHP以其类型杂耍而闻名.我必须承认这让我很困惑,而且我很难在比较中找出基本的逻辑/基本事物.
例如:如果$a > $b是真实的,$b > $c是真实的,必须将它意味着$a > $c是永远真实的吗?
遵循基本逻辑,我会说是的,但是我很困惑,我真的不相信PHP.也许某人可以提供一个不是这样的例子?
另外,我想知道严格的小于和严格的大于运算符(因为它们的含义被严格描述,我过去只从等式比较中知道)如果左右操作数交换时有任何区别严格不平等的价值观:
# Precondition:
if ($a === $b) {
throw new Exception(
'Both are strictly equal - can not compare strictly for greater or smaller'
);
}
($a > $b) !== ($b > $a)
Run Code Online (Sandbox Code Playgroud)
对于大多数类型比较组合,这些更大/更小的比较运算符没有记录,因此在这种情况下阅读手册并不是真正有用.
这是:
if(x != y)
{
}
Run Code Online (Sandbox Code Playgroud)
与此不同:
if (x is not y)
{
}
Run Code Online (Sandbox Code Playgroud)
或者说这两个条件没有区别?
大多数语言都有一个NaN常量,您可以使用它来为变量赋值NaN.python可以不使用numpy吗?
我需要编写一个函数来检测输入是否包含至少一个非数字值.如果找到非数字值,我将引发错误(因为计算应该只返回一个数值).预先不知道输入数组的维数 - 无论ndim如何,该函数都应给出正确的值.作为一个额外的复杂功能,输入可以是单个浮点数numpy.float64,甚至可以是像零维数组一样的奇怪数据.
解决此问题的显而易见的方法是编写一个递归函数,该函数迭代数组中的每个可迭代对象,直到找到非迭代.它将numpy.isnan()在每个不可迭代的对象上应用该函数.如果找到至少一个非数字值,则该函数将立即返回False.否则,如果iterable中的所有值都是数字,则最终将返回True.
这很好,但它很慢,我希望NumPy有更好的方法来做到这一点.什么是更快,更numpyish的替代品?
这是我的模型:
def contains_nan( myarray ):
"""
@param myarray : An n-dimensional array or a single float
@type myarray : numpy.ndarray, numpy.array, float
@returns: bool
Returns true if myarray is numeric or only contains numeric values.
Returns false if at least one non-numeric value exists
Not-A-Number is given by the numpy.isnan() function.
"""
return True
Run Code Online (Sandbox Code Playgroud) 如果我有两个对象o1和o2,我们就知道了
id(o1) == id(o2)
Run Code Online (Sandbox Code Playgroud)
返回true.
然后,它是否遵循这一点
o1 == o2
Run Code Online (Sandbox Code Playgroud)
或者情况并非如此?我正在研究的论文说情况并非如此,但在我看来应该是真的!
为什么 在Javascript 中NaN === NaN返回false?
> undefined === undefined
true
> NaN === NaN
false
> a = NaN
NaN
> a === a
false
Run Code Online (Sandbox Code Playgroud)
在文档页面上,我看到:
针对NaN的测试
等式运算符(
==和===)不能用于测试值NaN.请isNaN改用.
有什么参考可以回答这个问题吗?这将是受欢迎的.
Soooooo isNaN显然在JavaScript中被打破了,例如:
isNaN('')
isNaN(' ')
isNaN(true)
isNaN(false)
isNaN([0])
Run Code Online (Sandbox Code Playgroud)
回归假,当他们看起来都是......不是数字......
在ECMAScript 6中,草案包含一个新的,Number.isNaN但看起来像(imo)这也被打破了......
我期待
Number.isNaN('RAWRRR')
Run Code Online (Sandbox Code Playgroud)
要返回true,因为它是一个字符串,并且无法转换为数字...但是......

似乎我会考虑的事情......不是数字,确实不是,不是数字......
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isfinite-number
MDN的例子说:
Number.isNaN( "布拉布拉"); //例如,isNaN就是这样
我不明白这是怎样的"原始全球isNaN的更强大的版本." 当我无法检查,看看事情是不是一个数字.
这意味着我们仍然需要进行实际的类型检查以及检查isNaN ...这看起来很傻......
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isnan-number
这里的ES3草案基本上说,一切都是假的,除了它的Number.NaN
有没有人发现这个坏了或者我只是不明白isNaN的意思?
nan ×5
javascript ×3
python ×3
ieee-754 ×2
if-statement ×2
c# ×1
c++ ×1
comparison ×1
constants ×1
ecmascript-6 ×1
equality ×1
logic ×1
numpy ×1
php ×1
syntax ×1