Python 表示[0255]范围内的值所需的最小小数位数

Python 表示[0255]范围内的值所需的最小小数位数,python,floating-point,precision,floating-accuracy,Python,Floating Point,Precision,Floating Accuracy,假设在区间[0.0,1.0]中有一个浮点数,表示为字符串。我们将此值称为floatstr。我们还假设该值表示区间[0255]中的整数 将floatstr转换为整数的公式是(在python中): int(四舍五入(float(floatstr)*255)) floatstr中准确表示该值所需的最小小数点数是多少?如果有一个计算公式,那么这个最小值是如何计算的?两位数显然不会减少它。您只能表示100个不同的值。3位数怎么样 假设我们有一个数字x/255,我们将其显示到小数点后的3位,有效地将其四舍五

假设在区间
[0.0,1.0]
中有一个浮点数,表示为字符串。我们将此值称为
floatstr
。我们还假设该值表示区间
[0255]
中的整数

floatstr
转换为整数的公式是(在python中):
int(四舍五入(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
,因此
y/1000
另一侧的
1/255
的最近倍数必须至少在
1/255-1/2000
之外,距离
x/255
。因此,
x/255
1/255
y/1000
最接近的倍数,3位数就足够了。类似地,对于具有
n
位的任何分母
d
n
小数位应该足够了(如果
d
是10的幂,
n-1
小数位应该足够了)


(在这个推导过程中,我忽略了隐式浮点舍入误差的影响。对于小分母,浮点舍入误差不应该改变这个分析。)

两个数字显然不能解决这个问题。您只能表示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
,因此
y/1000
另一侧的
1/255
的最近倍数必须至少在
1/255-1/2000
之外,距离
x/255
。因此,
x/255
1/255
y/1000
最接近的倍数,3位数就足够了。类似地,对于具有
n
位的任何分母
d
n
小数位应该足够了(如果
d
是10的幂,
n-1
小数位应该足够了)


(在此推导过程中,我忽略了隐式浮点舍入误差的影响。对于小分母,浮点舍入误差不应改变此分析。)

您的逻辑不清楚,实际上我认为有很多方法可以将范围(0.0,1.0)中的浮点映射为范围(0,255)中的整数。为什么要使用这种算法?这个范围很小,你可以用蛮力来确定所需的值。最小值是3,因为
0.001
0.006
之间的数字是最小的数字,精度最低,以便生成1。因为
255=0.25*10**3
。因为数字1将为您生成255,所以您需要找到为您生成数字1的浮点数,因为您正在查找最小十进制数。所以你需要为你的数字创建一个科学的符号,那么10的幂就是小数的最小值。@Kasramvd:谢谢你的精彩解释。你的逻辑并不清楚,实际上我认为有很多方法可以将范围(0.0,1.0)中的浮点数映射为范围(0,255)中的整数。为什么要使用这种算法?这个范围很小,你可以用蛮力来确定所需的值。最小值是3,因为
0.001
0.006
之间的数字是最小的数字,精度最低,以便生成1。因为
255=0.25*10**3
。因为数字1将为您生成255,所以您需要找到为您生成数字1的浮点数,因为您正在查找最小十进制数。所以你需要为你的数字创建一个科学的符号,那么10的幂就是小数的最小值。@Kasramvd:谢谢你的精彩解释。使用256作为除数,你可以完全消除浮点舍入错误。在IEEE 754二进制浮点中,[0255]中的一个数除以256的所有除法都是精确的。@PatriciaShanahan:但是,在处理十进制表示法时,您仍然必须小心,因为如果您将其作为浮点读回,则会产生舍入错误,现在你又不得不考虑这是否重要了。通过使用256作为除数,你可以完全消除浮点舍入误差这一问题。在IEEE 754二进制浮点中,[0255]中的一个数除以256的所有除法都是精确的。@PatriciaShanahan:不过,在处理十进制表示法时,你还是要小心,因为如果你把它作为浮点读回,就会产生舍入错误,你又不得不考虑这是否重要了。