mirror of https://github.com/svaarala/duktape.git
Sami Vaarala
12 years ago
1 changed files with 46 additions and 0 deletions
@ -0,0 +1,46 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# |
||||
|
# Generate a table indicating how many digits should be considered |
||||
|
# significant for each radix (2 to 36) when doing string-to-number |
||||
|
# conversion. |
||||
|
# |
||||
|
# For decimal, the E5/E5.1 specification indicates that anything |
||||
|
# after the 20th digit can be ignored (treated as zero) and the |
||||
|
# 20th digit can be rounded upwards. We estimate the significant |
||||
|
# bits of precision from this and compute similar values for other |
||||
|
# radix values. |
||||
|
# |
||||
|
# Also generate a table of minimum and maximum radix-specific |
||||
|
# exponent values above and below which a number is guaranteed |
||||
|
# to overflow to Infinity or underflow to zero. This allows the |
||||
|
# C code to quick reject such exponent values, and to keep bigint |
||||
|
# values bounded. The exponent limit is relative to an integer |
||||
|
# significand padded to the precision-related digit count (e.g. |
||||
|
# 20 for decimal). |
||||
|
|
||||
|
import math |
||||
|
|
||||
|
digits_table = [] |
||||
|
limits_table = [] |
||||
|
|
||||
|
for radix in xrange(2, 36+1): |
||||
|
bits_per_digit = math.log(radix, 2) |
||||
|
|
||||
|
if radix == 10: |
||||
|
prec_digits = 20 |
||||
|
else: |
||||
|
target_bits = math.ceil(math.log(10, 2) * 20) + 2 # +2 is extra, just in case |
||||
|
prec_digits = int(math.ceil(target_bits / bits_per_digit)) |
||||
|
digits_table.append(prec_digits) |
||||
|
|
||||
|
# these are conservative (details are off by one etc); +/- 2 is the extra |
||||
|
overflow_limit = int(math.ceil(1024.0 / bits_per_digit)) + 2 - prec_digits |
||||
|
underflow_limit = int(math.floor((-1024.0 - 52.0) / bits_per_digit)) - 2 - prec_digits |
||||
|
|
||||
|
limits_table.append(overflow_limit) |
||||
|
limits_table.append(underflow_limit) |
||||
|
|
||||
|
print repr(digits_table) |
||||
|
print repr(limits_table) |
||||
|
|
||||
|
|
Loading…
Reference in new issue