在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
为什么?以及如何解决?
显然,正如许多用户所说,您遇到的问题与浮点精度和编译器相关的优化/选择有关如何对请求的操作进行编码有关。
关键在于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] 删除。
我来说两句