2015-02-09 146 views
0

由於微控制器的精度,我定義了一個包含兩個浮點數的比率的符號,而不是直接寫結果。浮點精度

#define INTERVAL   (0.01F/0.499F) 

代替

#define INTERVAL 0.02004008016032064F 

但第一溶液中添加其它的操作 「/」。如果我們通過優化和正確結果來推理,那麼最好的解決方案是什麼?

+0

正如答案所說,這些都是一樣的。根據使用這個常量的上下文,可能有更好的方法來優化它。 – 2015-02-09 15:07:14

回答

2

它們是相同的,編譯器會在編譯時評估0.01F/0.499F

您的常數值0.01F/0.499F = 0.02004008016032064F有錯誤。

+0

我明白了,你已經改正了這個值。 – 2015-02-09 15:09:49

+0

但是0.02004008016032064F是通過我的PC而不是通過微控制器來計算的。你確定精度是一樣的嗎? – 2015-02-09 15:22:11

+0

是的,有錯誤,價值在第一篇文章中更正。 – 2015-02-09 15:23:09

1

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以內。所以在某些情況下,常數會比商更好。

在更爲罕見的情況下,float的精度將會大於0.02004008016032064F,商數會更好。

最後,建議編碼用於驅動方程的任何值。例如如果0.010.499是兩個電阻的值,請使用這兩個值。