您将如何高精度比较从 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 而无需担心?

来自documentation for real

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)