我有一个浮点数242.1356783和-87.10234512,我需要把它限制在242.1我在下面尝试了cortex m4微控制器
1。[我]= (int)的数据(数据[我]* 10);
数据[我]=[我]/10;
2。Data [i]= ceilf(Data [i] * 100)/100;
3。Data [i] = rounddf (Data [i]*100)/100;
有人有其他解决方案吗?
浮点数通常使用二进制表示法进行编码:某个整数* 2的幂。
因此,242.1和-87.1不能完全编码为FP数。而是使用附近的一个。
我需要将它限制为242.1
OP可以使用以下方法:(round()
代替roundf()
以避免溢出)。
data[i] = (float) (round(data[i]*10.0)/10);
更复杂,但不调用double
数学,但处理大多数情况*:
// If there is a fraction ...
if (fmodf(data[i], 1.0f) && isfinite(data[i])) {
data[i] = roundf(data[i]*10.0f)/10;
}
最佳方案包括改变更高层次的目标。也许可以将值缩放到10。示例:内部使用2421.0 deci-degrees而不是242.1 degrees。
或者等待语言更新:c2x可能支持十进制FP。
OP建议的弱点:
data[i] = (int)(data[i] *10); data[i] = data[i]/10;
:在大约50%的时间内不对进行轮合。当data[i] *10
不在int
范围内时失败。data[i]= ceilf(data[i] * 100)/100;
:在大约50%的时间内不按正确的方向圆。data[i] *10
可能溢出。我怀疑OP想要10。data[i] = roundf(data[i]*100)/100;
data[i] *100
可能溢出。我怀疑OP想要10。
*可能在data[i]*10.0f
和product不精确且接近xxx.x5时不正确舍入