C STM32浮点数计算错误
我必须使用STM32距离传感器的测量值,使用2个浮点数进行计算。通过以下方程式进行计算: 结果=(df ds)/ds*10000 其中df为第一次测量,ds为第二次测量 方程的样本值 df=26.6810; ds=25.3270 我的问题是,STM32对这些值的计算结果是534.578247,但当我在Windows的计算器上手动计算时,我得到的结果是534.607336,这与STM32的计算结果大不相同。我也用过单手计算器,而单手计算器给出的结果和电脑完全一样 所有变量在程序中都声明为浮点数。 为什么两种计算之间有这么大的差异? 我可以做什么样的更改使STM32得到更精确的结果 提前感谢您的帮助 编辑:我使用的代码如下C STM32浮点数计算错误,c,stm32,floating,C,Stm32,Floating,我必须使用STM32距离传感器的测量值,使用2个浮点数进行计算。通过以下方程式进行计算: 结果=(df ds)/ds*10000 其中df为第一次测量,ds为第二次测量 方程的样本值 df=26.6810; ds=25.3270 我的问题是,STM32对这些值的计算结果是534.578247,但当我在Windows的计算器上手动计算时,我得到的结果是534.607336,这与STM32的计算结果大不相同。我也用过单手计算器,而单手计算器给出的结果和电脑完全一样 所有变量在程序中都声明为浮点数。
float result= 0;
dmbres = 27.4587;
int main()
{
while(1)
{
result= (float)((dmbres- res)/res)*10000;
dmbres = res;
sprintf(datapackage, "%d;%.4f;%.6f\r\n", mid, res,result);
monitor(datapackage);
}
数据包包含我从MCU需要的另外两个信息,它们与结果计算无关
我正在使用STM32F407 DISC-1板。您有以下代码:
float result= 0;
dmbres = 27.4587;
int main()
{
while(1)
{
result= (float)((dmbres- res)/res)*10000;
dmbres = res;
sprintf(datapackage, "%d;%.4f;%.6f\r\n", mid, res,result);
monitor(datapackage);
}
你给出了以下等式:
结果=(df ds)/ds*10000
使用以下值:
df=26.6810;ds=25.3270
您报告了以下结果:
结果=534.578247
我假设如下:
df
(26.6810)的显示值来自变量res
到字符串的转换:
sprintf(datapackage, "%d;%.4f;%.6f\r\n", mid, res,result);
由于此输出字符串正被四舍五入到小数点后4位,因此它来自的float res
值可能是26.6809501647921875到26.6810474395751953125范围内的任何值。这将形成循环下一次迭代的dmbres
值ds
(25.3270)显示的值来自循环下一次迭代中将变量res
转换为字符串。由于此输出字符串也被四舍五入到小数点后4位,因此它的float res
值可能是25.3269500732421875到25.3270473480224609375范围内的任何值result
(534.578247)显示的值来自变量result
到字符串的转换
sprintf(datapackage, "%d;%.4f;%.6f\r\n", mid, res,result);
对于浮点
,此输出字符串非常精确。最接近的存储值为534.5782470703125对于
df
和ds
的可能值,结果=(df-ds)/ds*10000
的最小可能值由给出(26.68095016479492191875-25.3270473480224609375)/25.3270473480224609375*10000,最大可能值由给出(26.6810474395751953125-25.32695500732421875)/25.3269500732421875*10000
由这两个表达式得出的最接近的
浮点值分别为534.5679931640625和534.6468505859375。您的实际结果534.5782470703125属于此范围,因此并非意外。如其他人所述,数字“太接近”。32位浮点使用23位作为有效位,因此只有约7位有效十进制数字。e、 g.1234567。您可以将小数点放在任何位置,但超过7的任何数字都是不精确的,尤其是使用它们执行计算时。64位double使用52位,可容纳约16位十进制数字
因此可以将变量声明为double。这将使您获得更大的精度范围,但代价是(大大)降低执行速度。C代码是什么?我认为,如果没有看到生成问题的代码,我们就无法理解问题。26.6810
不是浮点,而是双精度。这是哪个STM32,它有FPU吗?总的来说,回答这个问题的信息太少了。张贴实际代码。df
和ds
的大小太接近,减法不会对第四个有效数字产生影响。问题在于代码中没有粘贴。我添加了代码。感谢您的关注。由于您发布的数字精确,结果可能介于534.566797和534.647875之间,因此您的实际结果对我来说很好。