题目描述:
标题: 黄金连分数
黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
1
黄金数 = ---------------------
1
1 + -----------------
1
1 + -------------
1
1 + ---------
1 + ...
这个连分数计算的“层数”越多,它的值越接近黄金分割数。
请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
小数点后3位的值为:0.618
小数点后4位的值为:0.6180
小数点后5位的值为:0.61803
小数点后7位的值为:0.6180340
(注意尾部的0,不能忽略)
你的任务是:写出精确到小数点后100位精度的黄金分割值。
注意:尾数的四舍五入! 尾数是0也要保留!
显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
求解思路:
看到这道题,我第一反应就使用了for循环代码如下:
num_1 = 1
for i in range(1, 10000):
num_1 = 1/(1+num_1)
print(round(num_1, 100))
结果如下:
我发现就算用round取100也只能取到这几位于是我又用.%100来尝试了一下,代码如下:
num_1 = 1
for i in range(1, 10000):
num_1 = 1/(1+num_1)
print("%.100f" % num_1)
结果如下:
虽然取到了小数点后100位,但是不能正确的显示,这时我意识到可能是取到小数点后一定位数就取不到了。这是我想起了Python的标准库---decimal。通过阅读官方文档可知:
- 二进制和 decimal 浮点数都是根据已发布的标准实现的。 虽然内置浮点类型只公开其功能的一小部分,但 decimal 模块公开了标准的所有必需部分。 在需要时,程序员可以完全控制舍入和信号处理。 这包括通过使用异常来阻止任何不精确操作来强制执行精确算术的选项。
- decimal 模块旨在支持“无偏差,精确无舍入的十进制算术(有时称为定点数算术)和有舍入的浮点数算术”。
我的理解就是说decimal模块比Python内置的浮点型要牛,有很多内置浮点型没用的功能,并且是一个精准的十进制算数不会有误差,比如说不适用decimal模块运算如下:
会有误差。
简单的了解使用:通常使用 decimal 的方式是先导入该模块(from decimal import *),通过getcontext()查看当前上下文,并在必要时为精度、舍入或启用的陷阱设置新值。 可以基于整数、字符串、浮点数或元组构造 Decimal 实例。 基于整数或浮点数构造将执行该整数或浮点值的精确转换。 Decimal 数字包括特殊值例如 NaN
表示“非数字”,正的和负的 Infinity
和 -0
。
getcontext().prec = 7 # 设置一个新精度Decimal(10) # 转变类型
好下面展示一下我的解题代码:
from decimal import * # 导入decimal模块
getcontext().prec = 105 # 设置新精度(为了方便后续四舍五入,所以将精度稍微设大)
count = Decimal(1) # 转变count类型
for i in range(10000):
count = Decimal(1/(1+count))
print(round(count, 100)) # 使用round函数来进行四舍五入并且保留小数点后100位
结果如下: