Blame view

chap1/1_3_infinite.py 1.83 KB
bfb563e1   Chunk   first commit
1
2
3
__author__ = 'chunk'

import struct
8a43d8ec   Chunk   cc
4
import numpy as np
763affb7   Chunk   staged.
5
import math
bfb563e1   Chunk   first commit
6

e5dbe416   Chunk   staged.
7
8
from  common import *

bfb563e1   Chunk   first commit
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def float2bits(f, fmt='bin'):
    if fmt == 'hex':
        return hex(struct.unpack('!l', struct.pack('!f', f))[0])
    return bin(struct.unpack('!l', struct.pack('!f', f))[0])


def double2bits(d, fmt='bin'):
    if fmt == 'hex':
        return hex(struct.unpack('!q', struct.pack('!d', d))[0])
    return bin(struct.unpack('!q', struct.pack('!d', d))[0])


def float2bin(num):
    # http://stackoverflow.com/questions/16444726/binary-representation-of-float-in-python-bits-not-hex
    bits = [bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num)]
    print bits
    return ''.join(bits)


def double2bin(num):
bfb563e1   Chunk   first commit
29
30
31
32
33
    bits = [bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!d', num)]
    print bits
    return ''.join(bits)


763affb7   Chunk   staged.
34
def infinite_limit():
8a43d8ec   Chunk   cc
35
36
    s = np.float32(0)
    tmp = np.float32(-1)
bfb563e1   Chunk   first commit
37
    i = 0
8a43d8ec   Chunk   cc
38
    while s != tmp:
bfb563e1   Chunk   first commit
39
40
        i += 1
        tmp = s
8a43d8ec   Chunk   cc
41
        s += np.float32(1.0 / i)
bfb563e1   Chunk   first commit
42

e5dbe416   Chunk   staged.
43
44
    print i, s, tmp, float2bin(s)

763affb7   Chunk   staged.
45
46
47
48
49
def infinite_float(n):
    s = np.float32(0)
    for i in range(1, n + 1):
        s += np.float32(1.0 / i)
    return s
e5dbe416   Chunk   staged.
50
51
52
53
54
55
56
57
58
59
60
61
62

def infinite_double(n):
    s = np.float64(0)
    for i in range(1, n + 1):
        s += np.float64(1.0 / i)
    return s


def testn0():
    for i in range(100):
        print i, np.log(i)
        if np.log(i) >= 8:
            print i
bfb563e1   Chunk   first commit
63
64
65


if __name__ == '__main__':
e5dbe416   Chunk   staged.
66
    # testn0()
763affb7   Chunk   staged.
67
68
69
70
71
72
    infinite_limit()

    for i in range(1,11):
        print infinite_float(i)
    for i in range(1,11):
        print infinite_double(i)
e5dbe416   Chunk   staged.
73
74
75
76
77

    # i = 1
    # while infinite_double(i) < 16:
    #     i += 1
    # print i, infinite_double(i)
763affb7   Chunk   staged.
78

e5dbe416   Chunk   staged.
79
    timer = Timer()
763affb7   Chunk   staged.
80
81
82
83
84
85

    for i in range(1,8):
        n = math.pow(10,i)
        timer.mark()
        infinite_double(int(n)) # 1125899906842624
        timer.report()
bfb563e1   Chunk   first commit
86
    pass