C与Java原语转换和表达式
为什么这个等式在C(32位)和Java(64位)中为C与Java原语转换和表达式,java,c,casting,expression,primitive,Java,C,Casting,Expression,Primitive,为什么这个等式在C(32位)和Java(64位)中为e生成两个不同的值?他们的损失出乎意料地大 int a, b, c, d; double e; a = -12806; b = 1; c = 800; d = 19209; double f = (32768 / 10.24); e = (a + (double) b / c * d) / f; C产生-3.9940624237060547。Java生产-3.9943714843750002 更新: 对不起,各位,这个错误似乎超出了我的
e
生成两个不同的值?他们的损失出乎意料地大
int a, b, c, d;
double e;
a = -12806;
b = 1;
c = 800;
d = 19209;
double f = (32768 / 10.24);
e = (a + (double) b / c * d) / f;
C产生-3.9940624237060547。Java生产-3.9943714843750002
更新:
对不起,各位,这个错误似乎超出了我的预期。我将代码简化为这个等式,它生成的数字更接近于这个等式。在Java中,隐式大括号有点不同:
int a, b, c, d;
double e;
a = 3;
b = 4;
c = 5;
d = 6;
e = a + (double) b / c * d;
System.out.println("e=" + e);
e = a + (((double) b) / c) * d; // Java: 7.8
System.out.println("e=" + e);
如果在C中运行,您将看到差异。这里已经回答了这个问题:
你最好的选择是使用大小数,因为它们可以保持这种精度。有没有“意外的大数值”的例子?你使用了哪些输入,得到了哪些结果?在你的系统上,C和Java中的
sizeof(double)
是什么?