请教一个算法处理方式

2020-01-20 19:13发布

程序中需要求一个商(Z)的结果,这个商(Z)的结果最大不大于65535(10进制),其中有一个定值Y=10000000000(10进制),然后去读一个20位的ADC的数据变量X,这个X的最大结果不大于160000,最小不小于152600,(10进制,因此时读的结果并不是满幅值),然后用Y去除以读到的结果X,最后得到商Z,请问如何处理?
直接用Z=10000000000/X;试过,不行,算出的结果不准确,除法没有乘法准确。请问有什么好的办法去处理?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
NJ8888
1楼-- · 2020-01-21 00:36
 精彩回答 2  元偷偷看……
fulitun
2楼-- · 2020-01-21 01:04
x-152600,除数变小了,余数就小。不行吗?
编辑原因:@#¥@%#%……%…………
eduhf_123
3楼-- · 2020-01-21 02:16
对商(Z)的精度要求是多少?
eduhf_123
4楼-- · 2020-01-21 04:13
本帖最后由 eduhf_123 于 2015-1-23 08:25 编辑
  1. UInt16 calc_1E10_div_x(UInt32 x)
  2. {
  3.     static UInt16 area[29]=
  4.     {
  5.         65531,  65421,  65312,  65203,  65094,  64986,  64878,  64770,
  6.         64663,  64556,  64450,  64343,  64238,  64132,  64027,  63922,
  7.         63818,  63714,  63610,  63507,  63403,  63301,  63198,  63096,
  8.         62995,  62893,  62792,  62691,  62591
  9.     };
  10.     static UInt16 step[29]=
  11.     {
  12.         110,    109,    109,    109,    108,    108,    107,    107,
  13.         106,    106,    106,    105,    105,    105,    104,    104,
  14.         104,    104,    103,    103,    102,    102,    101,    101,
  15.         102,    101,    100,    100,    100
  16.     };
  17.    
  18.     UInt8  x_div, x_mod;
  19.     UInt16 temp_16;
  20.    
  21.     temp_16 = (UInt16)(x-152600);
  22.     x_mod = temp_16;
  23.     x_div = temp_16>>8;
  24.    
  25.     temp_16 = area[x_div] - ((x_mod * step[x_div] + 128)>>8);
  26.    
  27.     return temp_16;
  28. }
复制代码

可以这样试试,误差范围:[-1, +1]。
ztlaputa
5楼-- · 2020-01-21 04:44
哪位高手解释下为什么会不准确?
love_ourdev
6楼-- · 2020-01-21 05:55
 精彩回答 2  元偷偷看……

一周热门 更多>