无法将 0.001 添加到 REAL 数字

Pab*_*blo 2 floating-point plc twincat

这是 TwinCAT3 中的最少代码

// declaration
fTest : REAL := 32700.0;

// implementation
fTest := fTest + 0.001;
Run Code Online (Sandbox Code Playgroud)

该代码会将 fTest 增加到 32768。该数字不会再增加。任何高于 32768 的当前 fTest 值都将阻止其增加。数量保持不变。而且,即使我改为0.0010.00190.0011仍然不会增加。然而,当我写0.002.

范围REAL-3.402823e+38到产生3.402823e+38。但有一些与 32768 有关的东西。如何在 32768 以上的 fTest 中正确添加 0.001 或更低的值?这可能是 TwinCAT 中的一个错误吗?

更新:

有关 TwinCAT 中 REAL 的更多信息

根据 IEC 61131 3 / IEC 559 / IEEE754,32 位数据类型 REAL 的结构为 1 位符号、8 位以 2 为基数的指数(带符号)(-126...+127)、23 位尾数 (0 ...8,388,607)。

Fre*_*red 6

您遇到了 32 位浮点数尾数(大约 7 位十进制数字)所能表示的极限。这不是错误,而是设计使然,与 TwinCAT 无关。本机浮点运算不具有任意尾数精度,这是提高速度所需的权衡。

您可能需要使用 LREAL,它仍然有限制,但会产生应与您期望的结果。

请注意,如果您要乘或除这些数字,结果可能对您来说看起来不错。浮点数被分为尾数和指数,达到极限取决于您正在执行的操作是什么,而不仅仅是涉及的值。

关键是要记住浮点数不是真正的实数,它们是一个粗略的近似值。在某些情况下,“粗糙”可以翻译为“完全无法使用”。它们的目的是对于在正确编码的软件中处理的大多数实际情况非常快速地产生类似的、有用的结果。但在某些情况下,不了解和管理自己的极限可能会导致真正的问题、金钱损失、财产损失、伤害或死亡。