您将如何高精度比较从 Cpp 端发送到 QML 函数中的浮点数和双精度数?
How would you high precision compare floats & doubles sent into QML functions from Cpp side?
您如何比较从 Cpp 端发送到 QML 函数中的浮点数和双精度数?
如果我想像下面提到的那样进行高精度比较here
bool AreSame(double a, double b) {
return fabs(a - b) < EPSILON;
}
我应该如何在 Qt QML 中执行此操作?
或者,它是否被强制转换为 real in QML 而无需担心?
Note: In QML all reals are stored in double precision, IEEE floating point format.
来自documentation on data type conversion
+----------------+----------------+
| Qt Type | QML Basic Type |
+----------------+----------------+
| [...] | [...] |
| double | double |
| [...] | [...] |
| float, qreal | real |
+----------------+----------------+
因此,根据文档,并非所有内容都必须转换为 real
,但所有内容都将具有相同的精度,因此我认为您可以随意转换或比较它们。
您可以创建一个 JavaScript Library 来实现函数,就像您的问题中描述的那样。
或者你可以创建一个 C++ 对象,然后 expose a this function,这样你就可以直接在 C++ 中实现。然后你可以决定,是在每个文件中,在你需要的地方实例化这个对象,还是创建一个单例实例作为库。 AFAIK QML 在静态函数方面存在问题,需要对象的实例。
我不知道 QML 中有任何预定义变量指定 epsilon
。在 C++ 中,对我来说是:
std::numeric_limits<double>::epsilon() -> 2.220446049250313e-16
所以围绕这个可能是个不错的选择。
你应该像 JavaScript 那样做:
x = 0.2 + 0.1;
y = 0.3;
equal = Math.abs(x - y) < Number.EPSILON;
请注意,此值 属性 自 Qt 5.8 起可用 。在以前的 Qt 版本中,您可以定义自己的 epsilon,例如如:
readonly property double epsilon: Math.pow(2, -52)
您如何比较从 Cpp 端发送到 QML 函数中的浮点数和双精度数?
如果我想像下面提到的那样进行高精度比较here
bool AreSame(double a, double b) {
return fabs(a - b) < EPSILON;
}
我应该如何在 Qt QML 中执行此操作?
或者,它是否被强制转换为 real in QML 而无需担心?
Note: In QML all reals are stored in double precision, IEEE floating point format.
来自documentation on data type conversion
+----------------+----------------+
| Qt Type | QML Basic Type |
+----------------+----------------+
| [...] | [...] |
| double | double |
| [...] | [...] |
| float, qreal | real |
+----------------+----------------+
因此,根据文档,并非所有内容都必须转换为 real
,但所有内容都将具有相同的精度,因此我认为您可以随意转换或比较它们。
您可以创建一个 JavaScript Library 来实现函数,就像您的问题中描述的那样。
或者你可以创建一个 C++ 对象,然后 expose a this function,这样你就可以直接在 C++ 中实现。然后你可以决定,是在每个文件中,在你需要的地方实例化这个对象,还是创建一个单例实例作为库。 AFAIK QML 在静态函数方面存在问题,需要对象的实例。
我不知道 QML 中有任何预定义变量指定 epsilon
。在 C++ 中,对我来说是:
std::numeric_limits<double>::epsilon() -> 2.220446049250313e-16
所以围绕这个可能是个不错的选择。
你应该像 JavaScript 那样做:
x = 0.2 + 0.1;
y = 0.3;
equal = Math.abs(x - y) < Number.EPSILON;
请注意,此值 属性 自 Qt 5.8 起可用 。在以前的 Qt 版本中,您可以定义自己的 epsilon,例如如:
readonly property double epsilon: Math.pow(2, -52)