//indexOf()
console.log([1, 2, NaN].indexOf(NaN)); //-1
//includes()
console.log([1, 2, NaN].includes(NaN)); //trueRun Code Online (Sandbox Code Playgroud)
我不明白为什么includes可以在数组中找到 NaN,而indexOf不能。
我读到它的发生是因为indexOf内部使用了严格相等运算符(NaN === NaN)。但对我来说,当我们谈论 时,严格相等运算符和抽象相等运算符之间没有区别NaN。NaN无论如何都不能等于它自己。
//strict equality operator
console.log(NaN === NaN); //false
//abstract equality operator
console.log(NaN == NaN); //still falseRun Code Online (Sandbox Code Playgroud)
那么为什么这两种方法之间存在一些差异呢?
我有一组值 a[i]。
然后我计算
for(...){
b[i] = log(a[i]);
}
Run Code Online (Sandbox Code Playgroud)
然后我总结
for(...){
s += c[i] * b[i];
}
Run Code Online (Sandbox Code Playgroud)
到目前为止这没有问题。
但对于某些人来说,i我a[i]可能为零并导致b[i] = log(0) = -Inf. 对于这些i,c[i]也为零 - 这些是一些无效的数据点。但zero*-Inf似乎给了NaN,我的总和搞砸了......
有没有办法c[i] * b[i]在c[i]is = 0时总是有= 0?
我看到的唯一方法是将所有零设置a[i]为一个小的非零值或检查零,但可能有更好的解决方案。
我使用 C++ 和std数学函数,但我正在寻找一种尽可能通用的方法。
在C中,在使用IEEE-754浮点数的实现中,当我比较两个NaN的浮点数时,它返回0或"false".但是为什么两个浮点数都被认为是相等的呢?
这个程序打印"相等:......"(至少在Linux AMD64下使用gcc),在我看来它应该打印"不同:......".
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
volatile double a = 1e200; //use volatile to suppress compiler warnings
volatile double b = 3e200;
volatile double c = 1e200;
double resA = a * c; //resA and resB should by inf
double resB = b * c;
if (resA == resB)
{
printf("equal: %e * %e = %e = %e = %e * %e\n",a,c,resA,resB,b,c);
}
else
{
printf("different: %e * %e = %e != %e = %e * …Run Code Online (Sandbox Code Playgroud) 对于像NAor 这样的特殊值NaN,boost::unordered_map每次使用时都会创建一个新密钥insert.
// [[Rcpp::depends(BH)]]
#include <boost/unordered_map.hpp>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void test_unordered_map(NumericVector vec) {
boost::unordered_map<double, int> mymap;
int n = vec.size();
for (int i = 0; i < n; i++) {
mymap.insert(std::make_pair(vec[i], i));
}
boost::unordered_map<double, int>::iterator it = mymap.begin(), end = mymap.end();
while (it != end) {
Rcout << it->first << "\t";
it++;
}
Rcout << std::endl;
}
/*** R
x <- c(sample(10, 100, TRUE), rep(NA, 5), NaN) + …Run Code Online (Sandbox Code Playgroud) 我理解这背后的原因.我对技术实施感到好奇.无法在某个地方找到这个.
我的理论是,只要在任何比较中评估左NaN,它就会自动返回false而根本不进行比较.它是否正确?
任何人都可以详细说明syscalls/js为什么在第 57 行有一个声明
if f != f { ... }
Run Code Online (Sandbox Code Playgroud)
(f是类型float64)。
这怎么可能?就像一个语句时,可以i != i是true在go?
ISO/IEC 9899:2011§5.2.4.2.210(p48)说:
是否存在次正规数的特征是FLT_HAS_SUBNORM,DBL_HAS_SUBNORM和LDBL_HAS_SUBNORM的实现定义值:
-1不确定
0缺席(类型不支持次正规数)
1存在(类型支持次正规数)
什么了!所以在某些平台上我不能写double d = 33.3?或者编译器会自动将其转换为333E-1?存在或不存在非标准化浮点数的实际意义是什么?
我quickcheck为一个优化和评估函数的Haskell程序编写了测试.
问题是quickcheck生成表达式,结果NaN如下:
> acos(2)
NaN
Run Code Online (Sandbox Code Playgroud)
Haskell将以下语句评估为false:
> acos(2)==acos(2)
False
Run Code Online (Sandbox Code Playgroud)
所以我的quickcheck测试因这种比较而失败.有没有办法比较NaN价值观?
这是一个例子:
parseInt(50) > parseInt('a');
Run Code Online (Sandbox Code Playgroud)
在控制台上执行此操作时,它将返回false.我的原始代码看起来有点像这样:
variableB = parseInt(jQuery('some-element').html());
if(parseInt(variableA) > variableB)
// do something
else
// do something else
Run Code Online (Sandbox Code Playgroud)
有时some-element不会被填补,因此返回NaN.发生这种情况时,我确实希望else执行该块.我实际上得到了我的期望,但我只是想确保它确实打算以这种方式工作.
在像str in [str1, str2, str3]或的Python表达式1 in [1, 2, 3]中,in运算符是使用==还是is将第一个对象与列表中的对象进行比较?