【发布时间】:2013-12-11 13:28:50
【问题描述】:
但是,我正在使用的微芯片没有浮点精度空间。我需要在某些方程式中考虑小数值。到目前为止,我很幸运地使用了旧的 *100 -> /100 方法,如下所示:
increment = (short int)(((value1 - value2)*100 / totalSteps));
// later in the code I loop through the number of totolSteps
// adding back the increment to arrive at the total I want at the precise time
// time I need it.
newValue = oldValue + (increment / 100);
这对于 0-255 除以总步数最多为 300 的值非常有效。在 300 之后,小数点右侧的小数值变得很重要,因为它们当然会随着时间的推移而累加。
我很好奇是否有人有更好的方法在整数范式中保存小数精度?我尝试使用 *1000 /1000,但这根本不起作用。
提前谢谢你。
【问题讨论】:
-
如何让你需要关心的最小增量等于
1?那么实际值就是unsigned int乘以比例因子。将其视为以美分 (0.01) 而非美元/欧元/其他方式计算。 -
我不确定我是否理解您尝试实现的算法。你是在总结一堆整数 N1/1 + N2/2 + N3/3 + .. + N300/300 吗?无论如何,我建议您学习定点和有理算术(或切换到更大的 MCU。)
-
我在给定的周期数内创建从第一个值到第二个值的渐变。所以让我们说 0 - 200 / totalSteps = 用于相位 0 到 200 的增量(在子程序中检查其极性 +/- 之后)。本质上,定相必须在给定的周期内准确完成。它正在工作,但是当 totalSteps 超过 300 时,它会跳过至少 2 次迭代。
-
您不应该尝试使用以 10 为底的定点精度,而应使用以 2 为底的精度。这样做的好处是除法可以通过移位操作完成,而且累积的错误可能表现得更好。
-
所以我应该存储整个值向左移动了许多精度位置,然后在最后一秒将其移回右侧并转换最终值?这完全有道理。
标签: c floating-point integer