为什么这在 c++ 中与 javascript 不同

Why this in c++ is different than javascript

本文关键字:javascript 不同 中与 c++ 为什么      更新时间:2023-10-16

这在javascript中给出了73014902784

cs = [ 4, 4, 4, 8, 9];
var v, i, o, s = 1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4];
for(i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)){
    v += o*(((v/o)&15)+1);
}

因为 c++ 不处理除以零,所以我写了一个除法函数

int divide(int a, int b) 
{
    if (b == 0) 
    { 
        return 0; 
    }
    return a / b; 
}
int v, i, o, s = 1 << cs[0] | 1 << cs[1] | 1 << cs[2] | 1 << cs[3] | 1 << cs[4];
for (i = -1, v = o = 0; i < 5; i++, o = pow(2, cs[i] * 4)) {
    v += o*((divide(v,o) & 15) + 1);
}

但这给了我458752。为什么会这样?已经检查了一百万次。

我怀疑你的问题是 JavaScript 以 64 位浮点格式表示所有数字,而你的C++变量都被定义为(可能是 16 位)int。

JavaScript

在计算方面是错误的,你的C++ divide函数也是错误的。

  • 0 除以零以外的内容是无穷大。零/零是未定义的,它可以是任何东西(0,1,2,10,2000,无穷大,...
  • C++不处理除以零是有原因的,这很棘手。无穷大不是一个数字,它是一个概念,一些数学运算不适用于它。

    按位运算符&就是一个很好的例子,因为无穷大是任意定义的(有点像浮点数上的零),按位的结果也是任意的。

把无穷大想象成一个非常大的东西(不是一个数字!),你不知道那个东西到底是什么。也就是说,你取一个数字并除以一个非常小的数字,它应该给你一个非常大的东西,但你没有它的真实表示。