Algorithm 如何找到给定范围内以大多数零十进制数字结尾的浮点值?

Algorithm 如何找到给定范围内以大多数零十进制数字结尾的浮点值?,algorithm,math,floating-point,Algorithm,Math,Floating Point,是否有人有一种算法可以找到“min”和“max”之间的浮点值,当以十进制打印时,浮点值以最零位结束(或者换言之,小数位数最少)。当然,可能有几种解决方案:在500到2500之间,1000或2000都一样好。就我而言,两者都可以。 这是为了重新实现sndfile谱图中的轴标记代码,因此我的目标语言是C,但数学/伪代码是可以的。如果我正确理解您的问题,我认为这将获得最高的此类数字 float max = 432.334, min = 431.214; // The numbers you are l

是否有人有一种算法可以找到“min”和“max”之间的浮点值,当以十进制打印时,浮点值以最零位结束(或者换言之,小数位数最少)。当然,可能有几种解决方案:在500到2500之间,1000或2000都一样好。就我而言,两者都可以。
这是为了重新实现sndfile谱图中的轴标记代码,因此我的目标语言是C,但数学/伪代码是可以的。

如果我正确理解您的问题,我认为这将获得最高的此类数字

float max = 432.334, min = 431.214; // The numbers you are looking between
float r = 0.01; // The first decimal place to check
float x0 = max, x1 = max; // Working variables
while (x1 > min)
{
    x0 = x1;
    x1 = r*floor(x1/r)
    r *= 10;
}
你的答案是x0


编辑:再解释一下

这是通过将较大的数字四舍五入到连续递增的10次方来实现的。
r*楼层(x1/r)
会进行此舍入。例如:

r = 0.001
min, max = 0.1212, 0.1315
x1 = max

# Store the old value
x0 = x1
   = 0.1315

# Round down to the nearest r
x1 = r*floor(x1/r)
   = 0.001*floor(0.1315/0.001)
   = 0.001*floor(131.5)
   = 0.001*131
   = 0.131

# x1 is still larger than min, so multiply r by 10 and repeat
r  = 10*r
   = 10*0.001
   = 0.01
x0 = x1
   = 0.131
x1 = r*floor(x1/r)
   = 0.01*floor(0.131/0.01)
   = 0.01*floor(13.1)
   = 0.01*13
   = 0.13

# and again...
r  = 10*r
   = 10*0.01
   = 0.1
x0 = x1
   = 0.13
x1 = r*floor(x1/r)
   = 0.1*floor(0.13/0.1)
   = 0.1*floor(1.3)
   = 0.1*1
   = 0.1

# x1 is now smaller than min, so the loop ends. x0 is the last rounded value
# larger than min, so this is the answer.

基数2浮点几乎不可能你是在寻找一个完全可表示的浮点数,还是这真的是一个关于数学实数的问题?例如,你认为对于范围<代码>(0.121,0.131)< /代码>的答案是什么?是的,这是一个数学问题,而不是浮点表示问题。它不需要精确地表示,因为它需要找到一个锚定点来运行图形的刻度刻度,所以(0.121,0.131)应该给出0.130(或一个接近的表示值)。