0

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.

user65514
  • 1
  • 1

0 Answers0