Skip to content

Instantly share code, notes, and snippets.

@assafshomer
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save assafshomer/88053ae92db4446f23a1 to your computer and use it in GitHub Desktop.
Save assafshomer/88053ae92db4446f23a1 to your computer and use it in GitHub Desktop.
# Make sure to first bundle install gem 'terminal-table'
require 'terminal-table'
MAX_EXP = 16
def max_num(mantis_bits,available_bits)
mantis(mantis_bits)*(10**exponent(mantis_bits,available_bits))
end
def mantis(mantis_bits)
2**mantis_bits
end
def exponent(mantis_bits,available_bits)
2**(available_bits-mantis_bits)
end
def threshold_mantis?(mantis_bits,available_bits)
max_num(mantis_bits,available_bits) > 10**(MAX_EXP+1) &&
max_num(mantis_bits+1,available_bits) < 10**(MAX_EXP+1)
end
def calculate_scheme
max_supported_number = 10**MAX_EXP
table = Terminal::Table.new do |t|
t.title = "Encoding for maximum #{max_supported_number.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse} Units"
t << ['Flag (bits)','Significant Digits','Mantis (bits)','Exponent (bits)','Bits','Bytes']
t.add_separator
mantis_bits = 0
(1..10).each do |total_bytes|
total_bits = 8*total_bytes
available_bits = total_bits - 2
break_condition = 2**available_bits > 10**MAX_EXP
byte_flag_bits = (break_condition ? 2 : 3)
available_bits = total_bits - byte_flag_bits
until threshold_mantis?(mantis_bits,available_bits) do
break if mantis_bits == available_bits -1
mantis_bits +=1
end
mantis_bits = ((total_bytes==1 || break_condition) ? available_bits : mantis_bits)
exponent_bits = ((total_bytes==1 || break_condition) ? 0 : available_bits - mantis_bits)
significant = total_bytes==1 ? '1-31' : (2**mantis_bits).to_s.size-1
# minus one because e.g. 2^10 is 1024 which is 4 digits but is smaller than 9999 so with 10 bits we cannot support all 4 digit numbers, only all 3 digit numbers
t<<[byte_flag_bits,significant,mantis_bits,exponent_bits, total_bits, total_bytes]
break if break_condition
end
end
puts table
end
calculate_scheme
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment