浮动精度
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.01F
和 0.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 个值。
由于单片机的精度,我定义了一个包含两个浮点数比率的符号,而不是直接写结果。
#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.01F
和 0.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 个值。