Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C STM32浮点数计算错误_C_Stm32_Floating - Fatal编程技术网

C 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的计算结果大不相同。我也用过单手计算器,而单手计算器给出的结果和电脑完全一样 所有变量在程序中都声明为浮点数。

我必须使用STM32距离传感器的测量值,使用2个浮点数进行计算。通过以下方程式进行计算:

结果=(df ds)/ds*10000

其中df为第一次测量,ds为第二次测量

方程的样本值

df=26.6810; ds=25.3270

我的问题是,STM32对这些值的计算结果是534.578247,但当我在Windows的计算器上手动计算时,我得到的结果是534.607336,这与STM32的计算结果大不相同。我也用过单手计算器,而单手计算器给出的结果和电脑完全一样

所有变量在程序中都声明为浮点数。 为什么两种计算之间有这么大的差异? 我可以做什么样的更改使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.680950164792187526.6810474395751953125范围内的任何值。这将形成循环下一次迭代的
    dmbres

  • ds
    25.3270)显示的值来自循环下一次迭代中将变量
    res
    转换为字符串。由于此输出字符串也被四舍五入到小数点后4位,因此它的
    float res
    值可能是25.326950073242187525.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.5679931640625534.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之间,因此您的实际结果对我来说很好。