---
title: 数据精度和运算速度的中庸之道
categories:
  - 杂记
date: 2023-07-29 13:49:28
desc: 最近在写步进电机的S型加速算法，遇到了这个问题，由于要计算s型曲线，使用exp函数一次全部计算完大概需要1.2s，单片机的实时性得不到保证，每次在pwm中断回调中计算也是耗费算力…
abbrlink: shu-ju-jing-du-he-yun-suan-su-du-de-zhong-yong-zhi-dao
---
## 问题提出

最近在写步进电机的S型加速算法，遇到了这个问题，由于要计算s型曲线，使用exp函数一次全部计算完大概需要1.2s，单片机的实时性得不到保证，每次在pwm中断回调中计算也是耗费算力。而且我对于函数的封装也是封装了很多层，各种数据类型之间相互转换，精度下降很多。

## 问题解决

#### 计算速度慢的问题

我发现将double换为float，可以使速度提高10倍以上，因此使用expf，cosf函数将会大大节省运算时间。

#### 数据精度差的问题

在运算是，我很多变量是使用的是u32或者int类型，在进行除法时导致了精度的损失，把这些数据都换为float型，精度提高了很多。另外需要注意的是float的数据存放方式和int不同，float的范围也远远大于int，如果出现（float）a==（int）b这种判断语句，请一定要考虑到float的精度损失，在这个时候a很可能不等于b


---

**作者：**Wang Shijie

**本文链接：**[https://wsj-blog.pages.dev/posts/shu-ju-jing-du-he-yun-suan-su-du-de-zhong-yong-zhi-dao/](https://wsj-blog.pages.dev/posts/shu-ju-jing-du-he-yun-suan-su-du-de-zhong-yong-zhi-dao/)

本文采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)进行许可。