C ++ float和int除法奇怪的行为

用户名

在C ++ Qt库中有一个函数QRect screenGeometry()QRect具有功能int width()int height()如果我将此函数的结果保存到int变量中,则除法效果很好,但是如果我直接在除法中使用此函数之一,则会得到奇怪的结果:

QRect scr_size = QApplication::desktop()->screenGeometry();
int a = 1280;
int b = 720;
int c = scr_size.width();
int d = scr_size.height();
qDebug() << c; // 1920
qDebug() << d; // 1080
qDebug() << ((float(a) / b) - (float(c) / d)); // 0
qDebug() << ((float(a) / b) - (float(scr_size.width()) / d)); // 1.32455e-08
qDebug() << ((float(a) / b) - (float(c) / scr_size.height())); // 1.32455e-08
qDebug() << ((float(a) / b) - (float(scr_size.width()) / scr_size.height())); // 1.32455e-08

为什么?以及如何解决?

斯蒂法诺·布奥拉(Stefano Buora)

显然,正如许多用户所说,您遇到的问题与浮点精度和编译器相关的优化/选择有关如何对请求的操作进行编码有关。

关键在于qrect::width()qrect::height()实现:它们都内联,这意味着在预处理器之后的行:

((float(a) / b) - (float(scr_size.width()) / d))

将:

((float(a) / b) - (float(scr_size.x2-scr_size.x1+1) / d))

剩下的就是让编译器如何有效地对目标代码中的公式进行编码。

这就是为什么在所有调用qrect成员函数的行中得到不同结果的原因。

供您参考:永远不要将这种差异与0进行比较,这是一个常见错误,请简单检查一下绝对值(fabs(x))小于一个非常小的数字(例如0.0001)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章