表示 [0, 255] 范围内的值所需的最小小数位数
Minimum number of decimal places needed to represent a value in the range [0, 255]
假设我在区间 [0.0, 1.0]
中有一个浮点数,表示为一个字符串。我们将这个值称为 floatstr
。我们还假设此值表示区间 [0, 255]
.
中的整数
将floatstr
转换为整数的公式为(在python中):
int(round(float(floatstr)*255))
floatstr
中要准确表示此值所需的最小小数位数是多少?这个最小值是怎么算出来的,有公式吗?
两位数显然不行。您只能表示 100 个不同的值。 3位数怎么样?
假设我们有一个数字 x/255
,我们将其显示为小数点后 3 位数字,有效地将其四舍五入为某个数字 y/1000
。如果 x/255
是 1/255
最接近 y/1000
的倍数,则将 y/1000
乘以 255
并四舍五入将得到 x
。
如果x/255 = y/1000
,那么显然是1/255
的最接近倍数。否则,x/255
必须在y/1000
的1/2000
的距离内才能四舍五入到y/1000
,所以1/255
的最接近的倍数在[=的另一边11=] 必须至少有 1/255 - 1/2000
距离,比 x/255
更远。因此,x/255
是1/255
最接近y/1000
的倍数,3位就够了。类似地,对于具有 n
位的任何分母 d
,n
位小数应该足够(如果 d
是 10 的幂,则 n-1
位小数应该去做吧)。
(我在这个推导中忽略了隐式浮点舍入误差的影响。对于小分母,浮点舍入误差应该不会改变这个分析。)
假设我在区间 [0.0, 1.0]
中有一个浮点数,表示为一个字符串。我们将这个值称为 floatstr
。我们还假设此值表示区间 [0, 255]
.
将floatstr
转换为整数的公式为(在python中):
int(round(float(floatstr)*255))
floatstr
中要准确表示此值所需的最小小数位数是多少?这个最小值是怎么算出来的,有公式吗?
两位数显然不行。您只能表示 100 个不同的值。 3位数怎么样?
假设我们有一个数字 x/255
,我们将其显示为小数点后 3 位数字,有效地将其四舍五入为某个数字 y/1000
。如果 x/255
是 1/255
最接近 y/1000
的倍数,则将 y/1000
乘以 255
并四舍五入将得到 x
。
如果x/255 = y/1000
,那么显然是1/255
的最接近倍数。否则,x/255
必须在y/1000
的1/2000
的距离内才能四舍五入到y/1000
,所以1/255
的最接近的倍数在[=的另一边11=] 必须至少有 1/255 - 1/2000
距离,比 x/255
更远。因此,x/255
是1/255
最接近y/1000
的倍数,3位就够了。类似地,对于具有 n
位的任何分母 d
,n
位小数应该足够(如果 d
是 10 的幂,则 n-1
位小数应该去做吧)。
(我在这个推导中忽略了隐式浮点舍入误差的影响。对于小分母,浮点舍入误差应该不会改变这个分析。)