ceil(double(int)*double) 还是 ceil(float(int*double))?

0 c++ floating-accuracy ceil

我有这个 C++ 代码:

int x;
double y;

// do sth

int z = ceil(x*y);
Run Code Online (Sandbox Code Playgroud)

如果x = 410y = 1.1那么z = 452就该在什么时候451。我更改为z = ceil(float(x*y))并且有效。我的朋友建议z = ceil(double(x)*y)改为。的 2 个定义之间有什么区别吗z?我应该使用哪一个?

还有x*y做什么的?我怀疑它相当于float(x)*y但我不太确定。

Enc*_*ala 9

这一切是如何运作的

x * y只需将两个变量相乘即可。这会隐式执行类型转换,在本例中,在进行实际乘法之前将 int 值转换410为 double 值410.0(因为y是 double)。

由于这种类型转换,您朋友的建议只是您原始代码的功能的更明确的版本。它产生相同的结果,即它将给出452

你的问题的答案

如果 x = 410,y = 1.1,则 z = 452,而它应该是 451

确实如此,通过现实世界的演算。然而,计算机中的双精度数和浮点数的精度是有限的。如果您提高打印精度:

printf("%.15f\n", (x * y)); // -> 451.000000000000057
Run Code Online (Sandbox Code Playgroud)

您会同意,当ceil执行此操作时,它会产生452。其起作用的原因ceil(float(x * y))完全是出于偶然;因为 afloat的精度低于 adouble,所以它恰好四舍五入x * y451.000000...

您不能依靠浮点算术来准确产生您在现实世界中期望的结果,并且可以ceil在场景中使这一点变得非常明显,就像您给出的那样。如果没有有关您要解决的根本问题的更多信息,我无法就您可以做什么提供进一步的指导。