为什么这在 c++ 中与 javascript 不同
Why this in c++ is different than javascript
这在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++不处理除以零是有原因的,这很棘手。无穷大不是一个数字,它是一个概念,一些数学运算不适用于它。
按位运算符
&
就是一个很好的例子,因为无穷大是任意定义的(有点像浮点数上的零),按位的结果也是任意的。
把无穷大想象成一个非常大的东西(不是一个数字!),你不知道那个东西到底是什么。也就是说,你取一个数字并除以一个非常小的数字,它应该给你一个非常大的东西,但你没有它的真实表示。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 从不同线程使用int64的不同字节安全吗
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 函数向量_指针有不同的原型,我可以构建一个吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 访问者访问变体并返回不同类型时出错
- #为""定义宏;静态";针对不同的上下文
- 不同翻译单元中不可重载的非内联函数定义
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过继承类使用来自不同命名空间的运算符
- 我想做一个彼此不同但重复出现的数字
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在Javascript和C++中计算MD5哈希的不同结果
- 为什么这在 c++ 中与 javascript 不同
- Javascript与C++,相同的代码,不同的结果,这是为什么
- Google V8引擎可以在不同的上下文、不同的线程中同时运行不同的javascript吗?