Last active
August 29, 2015 14:23
-
-
Save assafshomer/88053ae92db4446f23a1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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