浮动精度

时间:2015-02-09 14:59:55

标签: c floating-accuracy

由于微控制器的精确性,我定义了一个包含两个浮点数的比率的符号,而不是直接写出结果。

#define INTERVAL         (0.01F/0.499F)

而不是

#define INTERVAL 0.02004008016032064F

但是第一个解决方案添加了另一个操作" /"。如果我们通过优化和正确的结果来推断,最佳解决方案是什么?

2 个答案:

答案 0 :(得分:2)

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

您的常量值0.01F/0.499F = 0.02004008016032064F中存在错误。

答案 1 :(得分:1)

0.01F/0.499F在编译时进行评估。编译时使用的精度取决于编译器,可能超过微控制器。因此,任何一种方法通常都会提供相同的代码。

在不可能的情况下,编译器的精度与微控制器的float和典型的二进制浮点大致相同,值0.01F和{{1}不会精确但在0.5 ULP(最后一个单位)内。然后,商0.499F将在大约sqrt(2)* 0.5 ULP内。使用0.01F/0.499F将在0.5 ULP内。因此,在选择情况下,常数将优于商。

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

最后,建议编码用于驱动等式的任何值。例如如果0.02004008016032064F 0.01是两个电阻的值,请使用这两个值。