I'm currently trying to implement a basic arithmetic encoder for Strings and I'm having trouble with finding the ranges of the frequency distribution.
This is my code:
TreeMap <Character,Integer> freq = new TreeMap <Character,Integer>();
TreeMap <Character,Range> rangeMap = new TreeMap <Character,Range>();
String encoding;
public void getRanges() {
double rangeSize = 1.0 / encoding.length();
System.out.println(rangeSize);
double lower = 0.0, higher = 0.0;
for (int i = 0; i < freq.size(); i++) {
Object key = freq.keySet().toArray()[i];
double val = freq.get(key);
higher = higher + (val * rangeSize);
rangeMap.put((char) key, new Range(lower, higher));
lower = higher;
}
}
When I input a String of length 5 ie "hello" it works fine,
{e=0.0 - 0.2, h=0.2 - 0.4, l=0.4 - 0.8, o=0.8 - 1.0}
but when I input a String of length 10 ie "bill gates" it gives me this:
{ =0.0 - 0.1, a=0.1 - 0.2, b=0.2 - 0.30000000000000004, e=0.30000000000000004 - 0.4, g=0.4 - 0.5, i=0.5 - 0.6, l=0.6 - 0.8, s=0.8 - 0.9, t=0.9 - 1.0}
I don't understand where the 0.30000000000000004 is coming from?
Any help would be appreciated, thanks.