‘壹’ python中格式化输出的问题求解,谢谢
:2d表示:右对齐,宽度为2
:6.4f表示:右对齐,宽度为6,且保留小数点后4位
使用":", 指定代表元素需要的操作。format格式化函数中,使用 {} 和 : 来代替Python2.6版本以前的 %
d表示十进制整数,f表示浮点数
.4和6.4的区别在于,后者指定了数据宽度。你如果把这句的6.4改成20.4,就会看出差别来了
‘贰’ 当使用print语句输出时,Python将所有浮 点数字格式化为小数点后两位。对吗
不会的,要配合format格式化输出。
x = 10/3
print(x)
print('{:.2f}'.format(x))
‘叁’ 关于python浮点数的精度及其造成的问题
在解决学术问题的过程中,Python因为其易用性和语法的简洁性而受到欢迎。然而,在某些实际问题中,由于Python默认的浮点数精度是双精度(64位),直接用此精度会出现非常大的问题。例如,回代根到等式发现等式不成立(从而造成恐慌)。本文记录了一种笔者找到的可能的解决方法用于解决Python精度不够的问题。
Python的默认浮点数是双精度。不过不论是什么精度,浮点数在计算机中都是以二进制保存。这就导致了在有限精度下,电脑为自己把精度范围外的小数“掐掉”,导致结果不准确。以下笔者展现一个经典的例子,0.1 + 0.2,其结果为0.30000000000000004,而不是0.3。
经过一些搜索,发现NumPy提供一个相对更高精度的数值类型numpy.float128()(或者numpy.longdouble(), numpy.longfloat()),它的精度比64位“稍高”。使用numpy.float128()之后,输出的结果更加接近真实值0.3。
这会导致什么问题?在大多数情况下(姑且如此说,毕竟我至今第一次遇到这个问题),不会有很大影响。但这不代表这个问题可以忽略。例如在使用SymPy求解方程时,如果直接使用默认浮点数,得到的结果并不能使等式两边成立。
我们首先尝试将64位浮点数替换为128位浮点数,但不幸的是,这种方法得到的精度提升有限。方程两边仍然无法成立。
通过搜索和求助,我得知了使用decimal包的方法。使用十进制数,这样应该就可以表示准确的小数了。但是如果直接使用SymPy去解方程,仍然不能得到精确结果!我推测SymPy仍然使用了浮点数。
在已知方程系数的情况下,求解方程的根有两种方法。一种是直接使用求根公式,适用于四次及以下的多项式方程。另一种是数值法,可以得到一个自定精度的估计值。
由于Python的decimal包中的Decimal类型的特殊性,许多常用的运算方法并不适用此类数值。接下来记录几种我从官方文档和Wikiversity中找到的常用运算方法。
来自Python官方文档:
来自Wikiversity:
可能有读者会好奇,为什么要摘录arctan()。原因是需要进行复数运算!在次数为2、3、4的一元方程中,非常容易出现复数。我针对自己的问题,对arctan()函数进行了一定的修改,并实现了能够进行复数运算的几种方法。此外,还定义了判断两个数是否相等的函数if_eq()。
到目前为止,我们已经能解决高达四次的一元方程。然而,对于大于或等于五次的多项式来说,现有方法似乎仍然显得黔驴技穷。
在没有求根公式的情况下,数值方法是一个解方程实根的很好途径。我使用了牛顿法来解决问题。参考Kong等人的在线书籍,代码实现如下,
到此为止,我们可以尝试一下,能否使用现有知识求解本文最初设置的方程。首先使用求根公式法,成功得到了方程的解!通过观察可得,仅仅是小数后被掐掉的部分不同,就会造成等式两边产生极大(绝对来说,非相对)的不同!
其次,尝试牛顿数值法。
可以看到,数值法的缺陷是需要设置不同的初值,才能得到不同的实根。但优点是,在计算机性能支持的前提下,可以逼近任意方程的某个根。可能有些读者会好奇,此处的“-10000000000000000000000”为何不需要将其进行“十进制化”?原因是在Python中,整数是精确的,不精确的只是浮点数。
本文讨论了在某些特殊方程中因为Python浮点数不够精确而导致的结果不精确的问题。当对结果的精度要求较高或者根的量级非常大时,推荐使用先求初值、再求精确值的方法进行求解。
‘肆’ python里面的这个8和15分别代表什么呀
这种题目,自己上机测试,会比较好理解,程序设计要多动手。
:>15s 是向右对齐,最小宽度15个字符(即不足15个字符会以空格补足15个字符)
:<8.2f是向左对齐,最小宽度8个字符,小数2位