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:不过,在处理十进制表示法时,你还是要小心,因为如果你把它作为浮点读回,就会产生舍入错误,你又不得不考虑这是否重要了。