程序中需要求一个商(Z)的结果,这个商(Z)的结果最大不大于65535(10进制),其中有一个定值Y=10000000000(10进制),然后去读一个20位的ADC的数据变量X,这个X的最大结果不大于160000,最小不小于152600,(10进制,因此时读的结果并不是满幅值),然后用Y去除以读到的结果X,最后得到商Z,请问如何处理?
直接用Z=10000000000/X;试过,不行,算出的结果不准确,除法没有乘法准确。请问有什么好的办法去处理?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
编辑原因:@#¥@%#%……%…………
- UInt16 calc_1E10_div_x(UInt32 x)
- {
- static UInt16 area[29]=
- {
- 65531, 65421, 65312, 65203, 65094, 64986, 64878, 64770,
- 64663, 64556, 64450, 64343, 64238, 64132, 64027, 63922,
- 63818, 63714, 63610, 63507, 63403, 63301, 63198, 63096,
- 62995, 62893, 62792, 62691, 62591
- };
- static UInt16 step[29]=
- {
- 110, 109, 109, 109, 108, 108, 107, 107,
- 106, 106, 106, 105, 105, 105, 104, 104,
- 104, 104, 103, 103, 102, 102, 101, 101,
- 102, 101, 100, 100, 100
- };
-
- UInt8 x_div, x_mod;
- UInt16 temp_16;
-
- temp_16 = (UInt16)(x-152600);
- x_mod = temp_16;
- x_div = temp_16>>8;
-
- temp_16 = area[x_div] - ((x_mod * step[x_div] + 128)>>8);
-
- return temp_16;
- }
复制代码可以这样试试,误差范围:[-1, +1]。
一周热门 更多>