我正在摆弄JavaScript中的按位运算符,我发现有一件事值得注意.
在按位或运算符返回1作为输出比特,如果两个输入比特中的一个是1.所以x | 0总是返回x,因为| 0没有效果:
( 1 | 0 ) === 1( 0 | 0 ) === 0但是,当我计算时Infinity | 0,我得到了0.这在我看来是令人惊讶的,因为通过上面的应该得到Infinity.毕竟,( x | 0 ) === x.
我无法在ECMAscript规范中找到明确定义的位置,因此我想知道究竟是什么意思( Infinity | 0 ) === 0.也许Infinity是存储在内存中的方式?如果是这样,怎么仍然可以做一个| 0操作导致它返回0而不| 0应该做任何事情?
javascript bit-manipulation bitwise-operators infinity bitwise-or
我需要一种方法来表示一个可以是无限的整数.我不想使用浮点类型(double.PositiveInfinity),因为数字永远不会是小数,这可能会使API混乱.做这个的最好方式是什么?
编辑:我还没有看到的一个想法是使用int?null表示无穷大.有没有充分的理由不这样做?
math.isinf()测试正或负无限集中在一起.什么是pythonic方式明确地测试它们?
测试正无穷大的方法:
x == float('+inf')math.isinf(x) and x > 0测试负无穷大的方法:
x == float('-inf')math.isinf(x) and x < 0拆卸方式1:
>>> def ispinf1(x): return x == float("inf")
...
>>> dis.dis(ispinf1)
1 0 LOAD_FAST 0 (x)
3 LOAD_GLOBAL 0 (float)
6 LOAD_CONST 1 ('inf')
9 CALL_FUNCTION 1
12 COMPARE_OP 2 (==)
15 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
拆卸方式2:
>>> def ispinf2(x): return isinf(x) and x > 0
...
>>> dis.dis(ispinfs)
1 0 LOAD_GLOBAL 0 (isinf)
3 LOAD_FAST 0 (x)
6 CALL_FUNCTION 1
9 JUMP_IF_FALSE_OR_POP …Run Code Online (Sandbox Code Playgroud) 在某些情况下,通常使用足够大的整数值来表示无穷大.我通常使用最大可表示的正/负整数.这通常会产生更多代码,因为您需要在几乎所有算术运算之前检查其中一个操作数是否为无穷大,以避免溢出.有时需要进行饱和整数运算.出于这个原因,有些人使用较小的无穷大值,可以添加或倍增几次而不会溢出.引起我兴趣的是,这一事实非常普遍(特别是在编程竞赛中):
const int INF = 0x3f3f3f3f;
Run Code Online (Sandbox Code Playgroud)
为什么这个号码特别?它的二进制表示是:
00111111001111110011111100111111
Run Code Online (Sandbox Code Playgroud)
我在这里看不到任何特别有趣的财产.我看到输入很容易,但如果这是原因,几乎任何事情都可以(0x3e3e3e3e,0x2f2f2f2f等).它可以添加一次而不会溢出,这允许:
a = min(INF, b + c);
Run Code Online (Sandbox Code Playgroud)
但是,所有其他常数都会这样做.谷歌搜索只显示了很多使用该常量的代码片段,但没有解释或评论.
谁能发现它?
C++标准(或IEEE 754浮点标准)中有什么保证1./std::numeric_limits<double>::infinity()零(或至少是一个小数字)?
根据Apple的文档,Swift不支持预处理器指令.在C/Objective-c中,"INFINITY"定义对某些检查非常有用.那么,我如何获得一个永远不会少于另一个的数字呢?
在节点命令行界面中运行时:
> Math.tan(Math.PI/2)
16331778728383844
Run Code Online (Sandbox Code Playgroud)
但在Chrome中:
> Math.tan(Math.PI/2)
Infinity
Run Code Online (Sandbox Code Playgroud)
是不是都使用相同的V8引擎?
节点的结果甚至不等于JavaScript中的最大"整数"值.
我无法理解Haskell中范围的以下行为.枚举1到1给我一个只包含1的列表,2到2给我一个列表,其中只包含2,如下所示.
Prelude> [1..1]
[1]
Prelude> [2..2]
[2]
Run Code Online (Sandbox Code Playgroud)
但是将无穷大枚举为无穷大给了我一个长度无限且所有元素都是无穷大的列表,如下所示.
Prelude> [1/0..1/0]
[Infinity,Infinity,Infinity,Infinity,Infinity,Infinity,Interrupted.
Run Code Online (Sandbox Code Playgroud)
我知道无限是一个不被视为数字的概念,但是这种行为的合理性是什么呢?
我发现自己有一个案例,相当于floor $ 1/0正在执行.
?> 1/0
Infinity
Run Code Online (Sandbox Code Playgroud)
这是正常的行为,据我理解,但,当Infinity是floor"d或ceiling" d
?> floor $ 1/0
179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
Run Code Online (Sandbox Code Playgroud)
而不是失败,而是产生了这么大的数字.为什么?
也许更重要的是,在应用其他功能之前,如何在不使用过滤器的情况下将其与非故障结果区分开来?