MIT公开课:计算机科学及编程导论 Python 笔记5 浮点数,逐次逼近法和二分法

Lecture5: Floating point number , successive refinement, finding roots 浮点数和二分法



3wschool 数字

>>> a = 2 ** 1000
>>> a
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L
>>> b = 2 ** 999
>>> b
5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688L
>>> a/b
2L

IEEE 754 floating point

wiki IEEE floating point

wiki IEEE 754 中文

  • scientific notation
  • a mantissa 尾数(0=< mantissa < 2) and an exponent 指数

    worry about == on float number!

>>> import math
>>> a = math.sqrt(2)
>>> a
1.4142135623730951
>>> a * a == 2
False
# 大约相等
abs(a*a - 2.0) < epsilon
>>> s = 0.0
>>> for i in range(10): s += 0.1
...
>>> s
0.9999999999999999


Why might this be a challenge? What are some of the issues?

  • might not be an exact answer 没有确切的值 例如:sqrt(2)
  • can’t enumerate all guesses 无法枚举所有的可能值,因为实数是不可数的
  • guess, check, and improve
  • successive approximation 逐次逼近法
# 逐次逼近法(伪代码):
guess = inital guess
for iter in range(100):
    if f(guess) close enough: return guess
    else: guess = better guess
error

逐次逼近法求平方根

- 二分法,求x的平方根,epsilon (ε) 是一个足够小的数,ctr 迭代次数

def squareRootBi(x, epsilon):
    """Assume x >= 0 and epsilon > 0
    Return y s.t. y*y is within epsilon(ε) of x"""

    assert epsilon > 0, ‘epsilon must be postive, not‘ + str(epsilon)
    low = 0
    high = max(x, 1)
    guess = (low + high) / 2.0
    ctr = 1
    while abs(guess ** 2 - x) > epsilon and ctr <= 100:
        # print ‘low:‘, low, ‘high:‘, high, ‘guess:‘, guess if guess**2 < x:
        if guess**2 < x:
            low = guess
        else:
            high = guess
        guess = (low + high) / 2.0
        ctr += 1
    assert ctr <= 100, ‘Iteration count exceeded‘
    print ‘Bi method. Num. iterations:‘, ctr, ‘Estimate:‘, guess
    return guess

def squareRootNR(x, epsilon):
    """Return y s.t. y*y is within epsilon of x"""

    assert epsilon > 0, ‘epsilon must be postive, not‘ + str(epsilon)
    x = float(x)
    guess = x / 2.0
    guess = 0.001
    diff = guess ** 2 - x
    ctr = 1
    while abs(diff) > epsilon and ctr <= 100:
        # print ‘Error:‘, diff, ‘guess:‘, guess guess = guess - diff/(2.0*guess)
        diff = guess ** 2 - x
        ctr += 1
    assert ctr <= 100, ‘Iteration count exceeded‘
    print ‘NR method. Num. iterations:‘, ctr, ‘Estimate:‘, guess
    return guess
时间: 2024-10-08 23:23:30

MIT公开课:计算机科学及编程导论 Python 笔记5 浮点数,逐次逼近法和二分法的相关文章

MIT麻省理工学院公开课:计算机科学及编程导论 Python 笔记1-3

Lecture1:Goals of the course; what is computation; introduction to data types, operators, and variables Python High (√) VS. low General (√) VS. targetted Interpreted (√) VS. compile Syntax语法:what are legal expressions "cat dog boy " Static seman

MIT公开课:计算机科学及编程导论 Python 笔记4 函数分解抽象与递归

Lecture4:Decomposition and abstraction through functions:introduction to recursion 函数分解抽象与递归 Functions 函数 block up into modules 分解为模块 suppress detail 忽略细节 create "new primitives" 创建原语的思考方式 w3school Python函数 #example code for finding square roots

计算机科学及编程导论(5)浮点数和二分法

1. Python的数字类型 Python的数字类型分为两类:整型(int)以及浮点型(float). 对于Python来说,整型可以取无限大. Python的整型可以取任意精度 例如,可以输入2**1000次方,仍然会返回正确结果. Python的浮点类型按照IEE754标准,对于64位的计算机而言,表示成如下方式 1位:符号位 11位:指数位 52位:尾数位 这样总共可以表示17位长的精度,如果超过17位,Python就无法处理,比如 0.1**1000次方. 在教学视频中,如果输入 x =

计算机科学及编程导论学习笔记

不要频繁变换变量的类型 多用有意义的通俗易懂的变量名 python的raw_input的值都默认为字符串 “=”是用来赋值的,将左边的名字绑定到右边的值上去.因此比较的时候要用“==” if <测试语句> :

计算机科学及编程导论(7)数组及可变性、字典、伪代码,代码运行效率简介

1. 数组及可变性 当创建一个数组的时候,它将与一个对象进行绑定 L1 = [1, 2, 3] L2 = L1 L1[0] = 4 print(L2)#=>[4, 2, 3] L2 = L1 意味着L2与L1指向同一个对象,而L1[0]=4则改变了对象的值,所以最终L2的值也会改变,可以与下面这个例子进行比较 a = 1 #a指向对象1 b = a #b指向对象a a = 4 #此时a指向了对象4 print(b) #=>1,由于b依旧指向对象1,所以没有发生变化 2.字典 字典包括了以下几个

计算机科学及编程导论(3)迭代程序的设计与实现、遍历、元组

1. 迭代程序的设计:基础元素 迭代程序的实现,通常包括下了以下五个部分: 计数器(Count):用于标记循环的次数 初始化(Initiate):在循环外部进行初始化 正确的结束测试(Right End Test):在什么情况下结束通常与计数器(Count)密切相关 循环部分的代码块:该部分代码块通常包含了对计数器的改变 结束后程序应该做什么 2. 迭代程序的设计:流程图 在使用具体的代码实现之前,可以用流程图来组织程序. 举一个简单的例子,已经一个正整数的平方为X,要求这个正整数,可以设这个正

计算机科学及编程导论(8)算法的复杂度

1.基于问题规模的复杂度计算方法 在考虑时间效率的时候,面临以下两个问题:输入规模以及步骤. 输入规模受很多因素影响:参数大小.参数类型(数组.元组的存取小绿是不同的),而且不同操作步骤(加减.判断)时间也不是相同的,为了方便计算,我们需要建立以下的假设: 假设从计算机取得任何变量的时间是相同的 假设基本操作时间恒定 接下来就可以考虑以下几种情况: 最好情况:何种输入会使得程序的运行时间最短? 最坏情况:何种输入会使得程序的运行时间最长? 平均情况 如果考虑平均情况的话,就要去设想问题输入规模的

斯坦福大学公开课:iOS 7应用开发 笔记

2015-07-06 第一讲   课务.iOS概述 -------------------------------------------------- 开始学习斯坦福大学公开课:iOS 7应用开发留下笔记

MIT公开课: Python 笔记6 二分法,牛顿-拉夫森方法,列表

Lecture5: Bisection methods , Newton/Raphson, introduction to lists二分法,牛顿,拉复生方法,列表 Bisection methods 二分法 注意: # bug: when x < 1, sqrt(x) > x = high eg.x=0.25 sqrt(x) = 0.5 # fix bug: high = max(x, 1.0) def squareRootBi(x, epsilon): """