我想知道明确的类型转换工作在哪个订单,在哪个区域工作。在下一个例子中,我收到了不同的结果。
float S = 0;
for (int i = 1; i <= 10; i++)
for (int j = 3; j <= 20; j++)
S += (i * j - 5.)/(2. * i + j / 3);
结果是621.8933
float S = 0;
for (float i = 1; i <= 10; i++)
for (float j = 3; j <= 20; j++)
S += (i * j - 5)/(2. * i + j / 3);
S = 607.3105
float S = 0;
for (int i = 1; i <= 10; i++)
for (int j = 3; j <= 20; j++)
S += (float)(i * j - 5)/(2 * i + j / 3);
S = 621.8933
float S = 0;
for (int i = 1; i <= 10; i++)
for (int j = 3; j <= 20; j++)
S += (i * j - 5)/(2 * i + j / 3.);
S = 607.3105
显然,正确的结果是607.3105。当我写(浮点)或乘以2时,为什么它不会提升,但是当它除以3时它会起作用? 提前致谢。
答案 0 :(得分:0)
代码1 S += (i * j - 5.)/(2. * i + j / 3);
:
j
是int
,因此完整除数是int
,并执行对int的隐式转换代码2 S += (i * j - 5)/(2. * i + j / 3);
j
,x
都是浮点数,所有连续结果也是浮点数代码3 S += (float)(i * j - 5)/(2 * i + j / 3);
j
是int
,因此完整除数是int
,并执行对int的隐式转换float
-是在计算除数之后执行的代码4 S += (i * j - 5)/(2 * i + j / 3.);
请注意,3.
是双精度型,3.f
是浮点型。这样会导致操作中使用不同的精度。