擅长:python、mysql、java
<p>在给定M和N的限制条件下,N/2**M的范围是一个定义良好的离散数标度:</p>
<p>[0-1000/2^26,501-1000/2^25,501-1000/2^24。。。501-1000/2^1, 501-1000/2^0]. 你知道吗</p>
<p>在这个给定的离散集合中,不同的子集具有不同的精度/分辨率。第一个子集[0-1000/2^26]的精度为2^26或26二进制位分辨率。因此,当给定的数字落在相应的连续域[01000/2^26]时,可以达到的最佳精度是2^26。依次地,当给定的数字超出第一个域但落在域[500/2^251000/2^25]中时,最佳精度为2^25,对应于第二个子集[501-1000/2^25]。(注意离散集和连续域之间的区别。)</p>
<p>根据上述逻辑,我们知道,由M定义的最佳精度取决于给定数字在刻度上的位置。因此,我们可以将其实现为以下python代码:</p>
<pre><code>import numpy as np
limits = 1000.0/2**np.arange(0,61)
a = 103.23 # test value
for i in range(60,-1,-1):
if a <= limits[i]:
N = i
M = round(a * 2**N)
r = [M, N]
break
if a > 1000:
r = [round(a), 0]
</code></pre>
<p>此解决方案具有O(c)执行时间,因此非常适合多次调用。你知道吗</p>