变量类型混乱
Variable types mess
为什么在下面的代码中我没有得到正常的结果?
void Motors::setCycleDutyA(int percentage) {
Serial.println(percentage);
Serial.println(pwmCycleDutyA);
float x=percentage/100;
Serial.print(x);
pwmCycleDutyA = int(255*x);
Serial.println(pwmCycleDutyA);
}
当我调用函数时:
Motors::setCycleDutyA(45);
我得到这些结果:
45 255 0.000
45 0 0.000
45 0 0.000
我错过了什么?
此处:
float x=percentage/100;
您正在执行整数除法(因为两个操作数都是整数)。这意味着每次percentage
小于100
时,结果将是0
。这就解释了你得到的结果。
改成:
float x=percentage/static_cast<float>(100);
或者:
float x=percentage/100.f;
问题是float x = percentage / 100
,其中percentage
是int
类型。这意味着/
的两个参数都是整数,因此执行整数除法。然后,将结果转换为float
。
你想要这个:
float x = percentage / 100.f;
或者直接将percentage
的类型更改为float
对于这种情况,我倾向于避免使用浮点数。像这样控制电机的代码通常运行在一个不直接支持浮点数的小型微控制器上,因此浮点计算通常在软件中模拟,这是缓慢的,并且可以添加相当多的额外代码。
因此,我尝试考虑是否可以在整数数学中完成。查看序列:
float x=percentage/100;
pwmCycleDutyA = int(255*x);
这基本上相当于:
pwbCycleDutyA = percentage * 2.55;
对于许多用途,将其视为percentage * 2.5
就足够了,这很容易在整数数学中呈现:
pwbCycleDutyA = (percentage * 5) / 2;
这将我们可以产生的值范围缩小到0。用250代替0…255——但请记住,由于百分比以int
开始,我们在任何情况下都只能生成100个离散值,所以这几乎不可能产生太大(如果有的话)差异。
但是,如果您确定乘数确实需要为2.55而不是2.5,您也可以这样做。最明显的方法是重新排列你的等式——不是先除以100再乘以255,而是先乘以255,再除以100:
pwbCycleDutyA = (percentage * 255) / 100;
在重新排列这样的方程时要记住的主要事情是确保不会溢出。假设percentage
永远不会超过100,我们是相当安全的——中间结果永远不会超过25500
,这很容易适用于有符号的16位int (C允许的最小值)。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 关于返回和参数类型的混乱
- 在Itanium c++ ABI中,为什么模板函数的混乱名称不能解析依赖类型?
- 愉快地连接不兼容的类型会导致混乱
- 类型转换时出错.混乱
- 变量类型混乱