由於微控制器的精度,我定義了一個包含兩個浮點數的比率的符號,而不是直接寫結果。浮點精度
#define INTERVAL (0.01F/0.499F)
代替
#define INTERVAL 0.02004008016032064F
但第一溶液中添加其它的操作 「/」。如果我們通過優化和正確結果來推理,那麼最好的解決方案是什麼?
由於微控制器的精度,我定義了一個包含兩個浮點數的比率的符號,而不是直接寫結果。浮點精度
#define INTERVAL (0.01F/0.499F)
代替
#define INTERVAL 0.02004008016032064F
但第一溶液中添加其它的操作 「/」。如果我們通過優化和正確結果來推理,那麼最好的解決方案是什麼?
它們是相同的,編譯器會在編譯時評估0.01F/0.499F
。
您的常數值0.01F/0.499F = 0.02004008016032064F
有錯誤。
我明白了,你已經改正了這個值。 – 2015-02-09 15:09:49
但是0.02004008016032064F是通過我的PC而不是通過微控制器來計算的。你確定精度是一樣的嗎? – 2015-02-09 15:22:11
是的,有錯誤,價值在第一篇文章中更正。 – 2015-02-09 15:23:09
0.01F/0.499F
在編譯時進行評估。編譯時使用的精度取決於編譯器,並可能超過微控制器的精度。因此,這兩種方法通常都會提供相同的代碼。
在不大可能編譯器的精度是大約相同的微控制器的float
和典型二進制浮點,值0.01F
和0.499F
不會確切但0.5 ULP(單元在最後的地方)內。然後商數0.01F/0.499F
將在大約sqrt(2)* 0.5 ULP內。使用0.02004008016032064F
將在0.5 ULP以內。所以在某些情況下,常數會比商更好。
在更爲罕見的情況下,float
的精度將會大於0.02004008016032064F
,商數會更好。
最後,建議編碼用於驅動方程的任何值。例如如果0.01
0.499
是兩個電阻的值,請使用這兩個值。
正如答案所說,這些都是一樣的。根據使用這個常量的上下文,可能有更好的方法來優化它。 – 2015-02-09 15:07:14