如何在Python中显示真正的数值?

如何在Python中显示真正的数值?,python,floating-point,precision,floating-accuracy,Python,Floating Point,Precision,Floating Accuracy,案例1: 对于[1,2,3,4,5,6,7,8,9]中的num: printformatnum,.50f 0.10000000000000000555111512312578270211815834045410 0.20000000000000001110223024625156540423631668090820 0.29999999999999998889776975374843459576368331909180 0.400000000000000022204460492503130808

案例1:

对于[1,2,3,4,5,6,7,8,9]中的num: printformatnum,.50f 0.10000000000000000555111512312578270211815834045410 0.20000000000000001110223024625156540423631668090820 0.29999999999999998889776975374843459576368331909180 0.40000000000000002220446049250313080847263336181641 0.50000000000000000000000000000000000000000000000000 0.59999999999999997779553950749686919152736663818359 0.69999999999999995559107901499373838305473327636719 0.80000000000000004440892098500626161694526672363281 0.90000000000000002220446049250313080847263336181641 不精确,如预期,除了

案例2:

对于[1,2,3,4,5,6,7,8,9]中的数值: printformatnum,.50f 1.00000000000000000000000000000000000000000000000000 2.00000000000000000000000000000000000000000000000000 3.00000000000000000000000000000000000000000000000000 4.00000000000000000000000000000000000000000000000000 5.00000000000000000000000000000000000000000000000000 6.00000000000000000000000000000000000000000000000000 7.00000000000000000000000000000000000000000000000000 8.00000000000000000000000000000000000000000000000000 9.00000000000000000000000000000000000000000000000000 完美的精度-

众所周知,在计算中不存在完美的浮点整数:所有浮点都用二进制基数表示,精度的提高取决于位大小float32、float64等。那么上面的情况2是如何处理的呢?零即使在.1000华氏度也能保持,基本上意味着无限精度。此外,0.5也以某种方式完美地表示出来

如果format不能强制Python打印浮点值的真实值,那么什么可以呢

尝试的替代方案:

formatroundnum,50,.50f formatnumpy.float128num,.50f formatroundnumpy.float128num,50.50f 格式%.50f%num {.50f}.formatnum f{num:.50f}
接受答案:澄清问题中假设的错误前提;实际问题的答案在问题本身中-使用格式来显示真实的数值。

整数值实数实际上可以完全精确地用二进制表示。 对于每个自然数n,存在一个自然数k,以及一个0-s和1-s的序列,以便:

n=b0*2^0+b1*2^1+…+bk*2^k

当然,即使您使用类型float,这也适用。数字以有限位数存储,因此具有无限精度

一些有理数也可以是,特别是那些可以表示为:

s=b1*0.5^1+b*20.5^2+…+b*k0.5^k+n

对于一些自然数k,n和一个二元向量


这就是为什么对于0.5可以获得完美的精度,但对于其他分数值却没有。举个例子,试试0.75,你在这里也会得到完美的精度。

整数值实数实际上可以以完美的精度用二进制表示。 对于每个自然数n,存在一个自然数k,以及一个0-s和1-s的序列,以便:

n=b0*2^0+b1*2^1+…+bk*2^k

当然,即使您使用类型float,这也适用。数字以有限位数存储,因此具有无限精度

一些有理数也可以是,特别是那些可以表示为:

s=b1*0.5^1+b*20.5^2+…+b*k0.5^k+n

对于一些自然数k,n和一个二元向量


这就是为什么对于0.5可以获得完美的精度,但对于其他分数值却没有。例如,尝试0.75-在这里也可以获得完美的精度。

在常用格式中,如IEEE 754 64位二进制浮点,所有有限浮点数都是二进制分数,形式为A*2B的数字,其中A和B都是有符号整数

当然,有限格式只能表示二进制分数的有限子集。A中有效位的数量和B的范围都受到格式的限制。对于正常或非低于正常的IEEE754 64位二进制文件,A的有效位不能超过53位,如果非零A规格化为1.x形式,B必须在范围内[−1022、1023]

0.5可以精确表示,因为它是1*2-1。 类似地,5.0/8.0 5*2-3等数字也是精确的

在64位二进制浮点中,所有适合32位二进制的整数都可以精确表示,这解释了问题中的第二个表。9是9*20


值得注意的是,在输出端,每个二进制分数都有一个终止的十进制扩展。这是2是10的一个因子的结果。打印足够的数字,您将获得浮点数的精确值。

在常用格式中,如IEEE 754 64位二进制浮点数,所有有限浮点数都是二进制分数,形式为A*2B的数字,其中A和B都是有符号整数

当然,有限格式只能表示二进制分数的有限子集。A中有效位的数量和B的范围都受到格式的限制。对于正常而非低于正常的IEEE754 64- 位二进制,A的有效位不能超过53位,如果非零A规格化为1.x形式,B必须在范围内[−1022、1023]

0.5可以精确表示,因为它是1*2-1。 类似地,5.0/8.0 5*2-3等数字也是精确的

在64位二进制浮点中,所有适合32位二进制的整数都可以精确表示,这解释了问题中的第二个表。9是9*20



值得注意的是,在输出端,每个二进制分数都有一个终止的十进制扩展。这是2是10的一个因子的结果。打印足够的数字,就可以得到浮点数的精确值。

这背后的gola是什么?你真的需要用50甚至10个零来表示一个值吗?@azro,有时-但我更感兴趣的是为什么Python会误导到这一点,以及如何绕过它为什么你认为第二组不能用浮点精确表示?@jonrsharpe 2的不完美幂-基本浮点算术理论;看,否则我认为你不明白那告诉你什么。3和5可以精确表示,即使它们不是2的幂。这背后的gola是什么?你真的需要用50甚至10个零来表示一个值吗?@azro,有时-但我更感兴趣的是为什么Python会误导到这一点,以及如何绕过它为什么你认为第二组不能用浮点精确表示?@jonrsharpe 2的不完美幂-基本浮点算术理论;看,否则我认为你不明白那告诉你什么。3和5可以精确表示,即使它们不是2的幂。不完全遵循这个解释-如果你从2^0开始,你如何得到0.5?某个地方应该有一个原子单位,即每个精度级别的最小可表示浮点,因此1。或者说.5的负幂倍数可以用它的2的幂来表示——你能举出这样一个单位吗?你不能从2^0开始。从b*2^0开始,b是0或1。如果b是0,你得到:0*2^0=0。同样,你如何得到0.5呢?假设你用32位表示整数部分,在我们的例子中是0,用32位表示小数部分,在我们的例子中是1/2。比:0.5=0*2^31+0*2^30+…+0*2^0+1*2^-1+0*2^-2+0*2^-3+…0*2^-k.+0*2^-32那么整数和小数部分分别表示了吗?我不知道-在你的答案中包括这一点,最好是引用/引用这一点,然后我会接受这一点-如果你从2^0开始,如何达到0.5?某个地方应该有一个原子单位,即每个精度级别的最小可表示浮点,因此1。或者说.5的负幂倍数可以用它的2的幂来表示——你能举出这样一个单位吗?你不能从2^0开始。从b*2^0开始,b是0或1。如果b是0,你得到:0*2^0=0。同样,你如何得到0.5呢?假设你用32位表示整数部分,在我们的例子中是0,用32位表示小数部分,在我们的例子中是1/2。比:0.5=0*2^31+0*2^30+…+0*2^0+1*2^-1+0*2^-2+0*2^-3+…0*2^-k.+0*2^-32那么整数和小数部分分别表示了吗?不知道-在你的回答中包括这一点,最好是引用/参考这一点,然后我将接受它感谢先进的细节;我现在的问题是,整型和分数型零件是否如@NG_建议的那样分别表示?因此,它们会在内存中占用单独的字节/字/等。某种位关系图会有所帮助,但不会essential@OverLordGoldDragon这确实是一个不同的问题,可能是重复的问题。考虑科学记数法,但标准化为二进制点前一位,只有分数实际存储。有一个很好的图表。有一个到副本的链接吗?谢谢你的高级细节;我现在的问题是,整型和分数型零件是否如@NG_建议的那样分别表示?因此,它们会在内存中占用单独的字节/字/等。某种位关系图会有所帮助,但不会essential@OverLordGoldDragon这确实是一个不同的问题,可能是重复的问题。考虑科学记数法,但标准化为二进制点前一位,只有分数实际存储。有一个很好的图表。有到副本的链接吗?