您如何比较从 Cpp 端发送到 QML 函数的浮点数和双精度数?
如果我想像下面提到的那样进行高精度比较here
bool AreSame(double a, double b) {
return fabs(a - b) < EPSILON;
}
我应该如何在 Qt QML 中做到这一点?
或者,它是否在 QML 中被转换为真实的并且不需要担心它?
您如何比较从 Cpp 端发送到 QML 函数的浮点数和双精度数?
如果我想像下面提到的那样进行高精度比较here
bool AreSame(double a, double b) {
return fabs(a - b) < EPSILON;
}
我应该如何在 Qt QML 中做到这一点?
或者,它是否在 QML 中被转换为真实的并且不需要担心它?
你应该像在JavaScript中那样做:
x = 0.2 + 0.1;
y = 0.3;
equal = Math.abs(x - y) < Number.EPSILON;
请注意,此 value 属性自 Qt 5.8 起可用。在以前的 Qt 版本中,您可以定义自己的 epsilon,例如:
readonly property double epsilon: Math.pow(2, -52)
注意:在 QML 中,所有实数都以双精度 IEEE 浮点格式存储。
+----------------+----------------+
| Qt Type | QML Basic Type |
+----------------+----------------+
| [...] | [...] |
| double | double |
| [...] | [...] |
| float, qreal | real |
+----------------+----------------+
因此,根据文档,并非所有内容都必须转换为real
,但所有内容都将具有相同的精度,因此我认为您可以随意转换或比较它们。
您可以创建一个JavaScript 库 来实现该函数,正如您的问题中所述。
或者您可以创建一个 C++ 对象,并公开一个 this 函数,这样您就可以直接在 C++ 中实现。然后你可以决定,是在每个文件中实例化这个对象,在你需要它的地方,还是创建一个单例实例作为库。AFAIK QML 在静态函数方面存在问题,需要对象的实例。
我不知道 QML 中有任何预定义变量指定epsilon
. 在 C++ 中,对我来说是:
std::numeric_limits<double>::epsilon() -> 2.220446049250313e-16
所以这附近的东西可能是一个不错的选择。