我必须做一个数学练习,要求我用 10^-5 的幅度构建 √3。
使用扫描方法和Python。
我是法国人,所以我不知道“扫荡”这个词是否正确。
在练习的早期,我得到了一些提示:
√3 是方程 x^2 - 3 = 0
的解
我需要达到 x*y 为负数的点
所以我尝试了这个:
x = 1
y = 1 + 10**-5
while (x** 2 - 3) * (y** 2 - 3) >= 0 :
x = x + 10**-5
y = y + 10**-5
print(x)
它给出了正确答案:1.73205,所以我可以框架 1.73205 < √3 < 1.73206 Do you know other ways to do this kind of maths ? Is there a "sweep" function for example? (Sorry if wrong word)
你知道做这种数学的其他方法吗
如果您的任务是使用“扫描”方法,您可以逐步建立答案,从一个大增量(一)开始,然后逐渐减少增量,例如,
In [73]: %reset -f
...: from fractions import Fraction as F
...: from decimal import Decimal as D
...:
...: x = F(1,1); y = F(1,1); ten = F(10,1)
...: for exp in range(21):
...: d = pow(ten, -exp)
...: while (x*x-3)*(y*y-3) > 0:
...: x, y = y, x+d
...: y = x
...: decimal = D(x.numerator)/D(x.denominator)
...: fill = '0' if exp else '.'
...: print('%2d'%(exp), str(decimal).ljust(exp+2, fill))
0 1.
1 1.7
2 1.73
3 1.732
4 1.7320
5 1.73205
6 1.732050
7 1.7320508
8 1.73205080
9 1.732050807
10 1.7320508075
11 1.73205080756
12 1.732050807568
13 1.7320508075688
14 1.73205080756887
15 1.732050807568877
16 1.7320508075688772
17 1.73205080756887729
18 1.732050807568877293
19 1.7320508075688772935
20 1.73205080756887729352
In [74]:
由于浮点数的精度有限,因此在代码中我使用了两个不同的 Python 标准库,
fractions
和 decimals
,以便能够以任意精度计算 sqrt(3)
。
所有数字
x
y
和 ten
都被初始化为 Fractions
,这意味着它们始终表示为两个 Python 整数之比(即任意精度),所有中间结果表示为也Fractions
。
最终,
Decimal
类用于将我们的结果表示为任意精度的浮点。
我稍微调整了一下格式,以获得完美的梯形输出,但如果你愿意,你可以简单地
print(exp, decimal)
。