浮动精度

Float precision

由于单片机的精度,我定义了一个包含两个浮点数比率的符号,而不是直接写结果。

#define INTERVAL         (0.01F/0.499F)

而不是

#define INTERVAL 0.02004008016032064F

但第一个解决方案添加了另一个操作“/”。如果我们通过优化和正确的结果进行推理,最好的解决方案是什么?

它们是相同的,您的编译器将在编译时计算 0.01F/0.499F

你的常量值有误0.01F/0.499F = 0.02004008016032064F

0.01F/0.499F 在编译时计算。编译时使用的精度取决于编译器,并且可能超过微控制器的精度。因此,这两种方法通常都会提供相同的代码。

在不太可能的情况下,编译器的精度与微控制器的 float 和典型的二进制浮点数大致相同,值 0.01F0.499F 将不准确但0.5 ULP以内(单位在最后一位)。商 0.01F/0.499F 将在大约 sqrt(2)*0.5 ULP 范围内。使用 0.02004008016032064F 将在 0.5 ULP 以内。所以在select的情况下,常数会比商更好。

在更罕见的情况下,float 精度将超过 0.02004008016032064F,商会更好。

最后,建议对用于驱动方程式的任何值进行编码。例如如果 0.01 0.499 是两个电阻的值,则使用这 2 个值。