我有这个 C++ 代码:
int x;
double y;
// do sth
int z = ceil(x*y);
Run Code Online (Sandbox Code Playgroud)
如果x = 410,y = 1.1那么z = 452就该在什么时候451。我更改为z = ceil(float(x*y))并且有效。我的朋友建议z = ceil(double(x)*y)改为。的 2 个定义之间有什么区别吗z?我应该使用哪一个?
还有x*y做什么的?我怀疑它相当于float(x)*y但我不太确定。
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 * y为451.000000...。
您不能依靠浮点算术来准确产生您在现实世界中期望的结果,并且可以ceil在场景中使这一点变得非常明显,就像您给出的那样。如果没有有关您要解决的根本问题的更多信息,我无法就您可以做什么提供进一步的指导。