git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/support/compute-powers.py

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
#!/usr/bin/env python
f8deb5b9 Poul Sander 2022-01-15 13:55 2
# Compute 10 ** exp with exp in the range [min_exponent, max_exponent] and print
f8deb5b9 Poul Sander 2022-01-15 13:55 3
# normalized (with most-significant bit equal to 1) significands in hexadecimal.
f8deb5b9 Poul Sander 2022-01-15 13:55 4
f8deb5b9 Poul Sander 2022-01-15 13:55 5
from __future__ import print_function
f8deb5b9 Poul Sander 2022-01-15 13:55 6
f8deb5b9 Poul Sander 2022-01-15 13:55 7
min_exponent = -348
f8deb5b9 Poul Sander 2022-01-15 13:55 8
max_exponent = 340
f8deb5b9 Poul Sander 2022-01-15 13:55 9
step = 8
f8deb5b9 Poul Sander 2022-01-15 13:55 10
significand_size = 64
f8deb5b9 Poul Sander 2022-01-15 13:55 11
exp_offset = 2000
f8deb5b9 Poul Sander 2022-01-15 13:55 12
f8deb5b9 Poul Sander 2022-01-15 13:55 13
class fp:
f8deb5b9 Poul Sander 2022-01-15 13:55 14
    pass
f8deb5b9 Poul Sander 2022-01-15 13:55 15
f8deb5b9 Poul Sander 2022-01-15 13:55 16
powers = []
f8deb5b9 Poul Sander 2022-01-15 13:55 17
for i, exp in enumerate(range(min_exponent, max_exponent + 1, step)):
f8deb5b9 Poul Sander 2022-01-15 13:55 18
    result = fp()
f8deb5b9 Poul Sander 2022-01-15 13:55 19
    n = 10 ** exp if exp >= 0 else 2 ** exp_offset / 10 ** -exp
f8deb5b9 Poul Sander 2022-01-15 13:55 20
    k = significand_size + 1
f8deb5b9 Poul Sander 2022-01-15 13:55 21
    # Convert to binary and round.
f8deb5b9 Poul Sander 2022-01-15 13:55 22
    binary = '{:b}'.format(n)
f8deb5b9 Poul Sander 2022-01-15 13:55 23
    result.f = (int('{:0<{}}'.format(binary[:k], k), 2) + 1) / 2
f8deb5b9 Poul Sander 2022-01-15 13:55 24
    result.e = len(binary) - (exp_offset if exp < 0 else 0) - significand_size
f8deb5b9 Poul Sander 2022-01-15 13:55 25
    powers.append(result)
f8deb5b9 Poul Sander 2022-01-15 13:55 26
    # Sanity check.
f8deb5b9 Poul Sander 2022-01-15 13:55 27
    exp_offset10 = 400
f8deb5b9 Poul Sander 2022-01-15 13:55 28
    actual = result.f * 10 ** exp_offset10
f8deb5b9 Poul Sander 2022-01-15 13:55 29
    if result.e > 0:
f8deb5b9 Poul Sander 2022-01-15 13:55 30
        actual *= 2 ** result.e
f8deb5b9 Poul Sander 2022-01-15 13:55 31
    else:
f8deb5b9 Poul Sander 2022-01-15 13:55 32
        for j in range(-result.e):
f8deb5b9 Poul Sander 2022-01-15 13:55 33
            actual /= 2
f8deb5b9 Poul Sander 2022-01-15 13:55 34
    expected = 10 ** (exp_offset10 + exp)
f8deb5b9 Poul Sander 2022-01-15 13:55 35
    precision = len('{}'.format(expected)) - len('{}'.format(actual - expected))
f8deb5b9 Poul Sander 2022-01-15 13:55 36
    if precision < 19:
f8deb5b9 Poul Sander 2022-01-15 13:55 37
        print('low precision:', precision)
f8deb5b9 Poul Sander 2022-01-15 13:55 38
        exit(1)
f8deb5b9 Poul Sander 2022-01-15 13:55 39
f8deb5b9 Poul Sander 2022-01-15 13:55 40
print('Significands:', end='')
f8deb5b9 Poul Sander 2022-01-15 13:55 41
for i, fp in enumerate(powers):
f8deb5b9 Poul Sander 2022-01-15 13:55 42
    if i % 3 == 0:
f8deb5b9 Poul Sander 2022-01-15 13:55 43
        print(end='\n ')
f8deb5b9 Poul Sander 2022-01-15 13:55 44
    print(' {:0<#16x}'.format(fp.f, ), end=',')
f8deb5b9 Poul Sander 2022-01-15 13:55 45
f8deb5b9 Poul Sander 2022-01-15 13:55 46
print('\n\nExponents:', end='')
f8deb5b9 Poul Sander 2022-01-15 13:55 47
for i, fp in enumerate(powers):
f8deb5b9 Poul Sander 2022-01-15 13:55 48
    if i % 11 == 0:
f8deb5b9 Poul Sander 2022-01-15 13:55 49
        print(end='\n ')
f8deb5b9 Poul Sander 2022-01-15 13:55 50
    print(' {:5}'.format(fp.e), end=',')
f8deb5b9 Poul Sander 2022-01-15 13:55 51
f8deb5b9 Poul Sander 2022-01-15 13:55 52
print('\n\nMax exponent difference:',
f8deb5b9 Poul Sander 2022-01-15 13:55 53
      max([x.e - powers[i - 1].e for i, x in enumerate(powers)][1:]))
1970-01-01 00:00 54