<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin Ankerl &#187; programming</title>
	<atom:link href="http://martin.ankerl.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://martin.ankerl.com</link>
	<description>No movement is faster than no movement</description>
	<lastBuildDate>Tue, 13 Jul 2010 05:31:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>svn-shortlog &#8212; Compact &amp; Beautiful Subversion Changelog</title>
		<link>http://martin.ankerl.com/2009/12/23/svn-shortlog-compact-beautiful-subversion-changelog/</link>
		<comments>http://martin.ankerl.com/2009/12/23/svn-shortlog-compact-beautiful-subversion-changelog/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 16:58:17 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=303</guid>
		<description><![CDATA[At work we periodically have short developer meetings to discuss what has happened in the last month. To do this, we go through the bugs in our issue tracking system, and the subversion commits in our repository. Unfortunately, getting an overview of the subversion commits was rather cumbersome, and we could not find any efficient [...]]]></description>
			<content:encoded><![CDATA[<p>At work we periodically have short developer meetings to discuss what has happened in the last month. To do this, we go through the bugs in our issue tracking system, and the subversion commits in our repository. Unfortunately, getting an overview of the subversion commits was rather cumbersome, and we could not find any efficient tool to do this. Hence, <strong>svn-shortlog</strong> was born.</p>
<p>This is an attempt to format the subversion log of a one-month period in the following way:</p>
<ul>
<li>Beautiful HTML output.</li>
<li>Compact representation of lots of information</li>
<li>Usable with a not-so color rich beamer.</li>
<li>Fully automatic.</li>
</ul>
<h2>Usage</h2>
<ol>
<li>Install <a href="http://www.ruby-lang.org/de/">Ruby</a> (both 1.8 or 1.9 should work).</li>
<li>Download <a href="http://svn-shortlog.googlecode.com/svn/trunk/svn-shortlog.rb">svn-shortlog.rb</a>.</li>
<li>Open <tt>svn-shortlog.rb</tt> with your favourite text editor, and configure the config section according to your needs.</li>
<li>Doubleclick <tt>svn-shortlog.rb</tt></li>
<li>Open the generated <tt>changelog_....html</tt> file with your favourite browser.</li>
</ol>
<h2>Sample Output</h2>
<p>Here is a <a target="_blank" href="http://martin.ankerl.com/wp-content/uploads/2009/12/changes_2009-12-01_to_2009-12-31.html">sample output of one month of boost commits</a> into trunk, taken from the <a href="http://www.boost.org/users/download/#repository">public repository</a>. The output is quite information dense, a quick description is in the screenshot: <center><img src="http://martin.ankerl.com/wp-content/uploads/2009/12/documentation.png" alt="" title="documentation" width="690" height="408" /></center> All commits are structured by user, then by date. Each commit is on one line. You can click each line to see the full information related to a commit.</p>
<h2>Issues</h2>
<p>Ideas, suggestions, problems? Please post them as a comment here, at the <a href="https://code.google.com/p/svn-shortlog/issues/list">bug tracker</a>.</p>
<h2>Credits</h2>
<p>This tool is based on the idea from my colleague <a href="http://cheind.wordpress.com/">Christoph Heindl</a> and inspired by <a href="http://groups.google.com/group/linux.kernel/msg/d43224c9ba53f0cc?">Linus&#8217; Kernel shortlog</a> and <a href="http://mail.google.com/">Gmail</a>.</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=303&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2009/12/23/svn-shortlog-compact-beautiful-subversion-changelog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Online Password Encrypter for Apache</title>
		<link>http://martin.ankerl.com/2009/05/22/online-password-encrypter-for-apache/</link>
		<comments>http://martin.ankerl.com/2009/05/22/online-password-encrypter-for-apache/#comments</comments>
		<pubDate>Fri, 22 May 2009 21:33:35 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=213</guid>
		<description><![CDATA[Apache uses (among other hashes) SHA-1 keys for encryption in the .htpasswd. I administer a subversion server, and from time to time I have to add new external users to the system. This is usually rather cumbersome because there is no easy way to get to their encrypted password. Thats why I have created The [...]]]></description>
			<content:encoded><![CDATA[<p>Apache uses (among other hashes) SHA-1 keys for encryption in the .htpasswd. I administer a subversion server, and from time to time I have to add new external users to the system. This is usually rather cumbersome because there is no easy way to get to their encrypted password.</p>
<p>Thats why I have created <a href="http://martin.ankerl.com/files/pwd-encrypter.html">The Online Password Encrypter</a>. Here users can enter their desired username and password, and the encrypted key is automatically generated online, without transmitting anything to any server.</p>
<p>Here is an iframe of the file. <a href="http://martin.ankerl.com/files/pwd-encrypter.html">Click here for full screen</a>.</p>
<p><iframe src ="http://martin.ankerl.com/files/pwd-encrypter.html" width="95%" height="650">
<p>Your browser does not support iframes.</p>
<p></iframe></p>
<p>The <a href="http://martin.ankerl.com/files/pwd-encrypter.html">Online Password Encrypter</a> is just one single HTML page, it does not depend on any other files. So it is easy to download it, modify and send it around. Feel free do whatever you want with it.</p>
<p>Have fun,<br />
Martin</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=213&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2009/05/22/online-password-encrypter-for-apache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Beautiful Font Hinting in Ubuntu 8.10 and 9.04</title>
		<link>http://martin.ankerl.com/2009/01/22/beautiful-font-hinting-in-ubuntu-810/</link>
		<comments>http://martin.ankerl.com/2009/01/22/beautiful-font-hinting-in-ubuntu-810/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 20:59:03 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tricks]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=197</guid>
		<description><![CDATA[Even though I have an LCD monitor, I always have the subpixel hinting switched off because it is just painfully ugly to my eyes. Even when hinting is switched to maximum, the fonts are quite blurry (if you don&#8217;t believe me, type xmag and take a screenshot of your font. You can see red and [...]]]></description>
			<content:encoded><![CDATA[<p>Even though I have an LCD monitor, I always have the subpixel hinting switched off because it is just painfully ugly to my eyes. Even when hinting is switched to maximum, the fonts are quite blurry (if you don&#8217;t believe me, type <tt>xmag</tt> and take a screenshot of your font. You can see red and blue linese everywhere). My eyes hurt when I see this. </p>
<p>Thanks to <a href="http://johan.kiviniemi.name/blag/ubuntu-fonts/">Johan Kivinemi</a> I have just found out how to bring back the excellent legacy subpixel hinting engine. This has a much more crisp hinting, and uses subpixels only where it really is an improvement:</p>
<p>Just open these files in your home directory, and copy the content into them:</p>
<h2>~/.fonts.conf</h2>
<pre class="brush: xml;">
&lt;?xml version='1.0'?&gt;
&lt;!DOCTYPE fontconfig SYSTEM 'fonts.dtd'&gt;
&lt;fontconfig&gt;
  &lt;match target=&quot;font&quot;&gt;
    &lt;edit name=&quot;antialias&quot; mode=&quot;assign&quot;&gt;
      &lt;bool&gt;true&lt;/bool&gt;
    &lt;/edit&gt;
    &lt;edit name=&quot;hinting&quot; mode=&quot;assign&quot;&gt;
      &lt;bool&gt;true&lt;/bool&gt;
    &lt;/edit&gt;
    &lt;edit name=&quot;hintstyle&quot; mode=&quot;assign&quot;&gt;
      &lt;const&gt;hintfull&lt;/const&gt;
    &lt;/edit&gt;
    &lt;edit name=&quot;lcdfilter&quot; mode=&quot;assign&quot;&gt;
      &lt;const&gt;lcdlegacy&lt;/const&gt;
    &lt;/edit&gt;
    &lt;edit name=&quot;rgba&quot; mode=&quot;assign&quot;&gt;
      &lt;const&gt;rgb&lt;/const&gt;
    &lt;/edit&gt;
  &lt;/match&gt;
&lt;/fontconfig&gt;
</pre>
<h2>~/.Xresources</h2>
<pre class="brush: xml;">
Xft.antialias:  true
Xft.hinting:    true
Xft.hintstyle:  hintfull
Xft.lcdfilter:  lcdlegacy
Xft.rgba:       rgb
</pre>
<p>This should work in Ubuntu 8.04, 8.10, and 9.04 too, and makes all fonts much more crisp. Of course, your mileage may vary.</p>
<h1>UPDATE: Comparison Screenshots</h1>
<p>As promised on <a href="http://www.reddit.com/r/linux/comments/7ru91/beautiful_font_hinting_in_ubuntu_810/">reddit</a>, I got back from an awesome snowboard trip so I am able to put up extensive comparison screenshots of the two subpixel hinting engines. Move your mouse over the following images to see the differences. Watch especially out for letters like &#8220;m&#8221; where the spacing between the lines is very small. You might have to wait a bit for the image to load.</p>
<p>I have used all of the most important fonts that I usually use, and just for fun I have added &#8220;Dijkstra&#8221;, which just looks cool.</p>
<h2>Sans Fonts</h2>
<p>Mouse to see the same fonts with the legacy hinter.</p>
<style type="text/css"><!-- #sans a { text-decoration:none; display:block; background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/sans-normal.png); width:395px; height:850px; } #sans a:hover {background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/sans-legacy.png); } --> </style>
<div id="sans">
<a href="#">&nbsp;</a>
</div>
<h2>Mono Fonts</h2>
<p>Mouse to see the same fonts with the legacy hinter.</p>
<style type="text/css"><!-- #mono a { text-decoration:none; display:block; background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/mono-normal.png); width:430px; height:940px; } #mono a:hover {background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/mono-legacy.png); } --> </style>
<div id="mono">
<a href="#">&nbsp;</a>
</div>
<h2>Zoomed Comparison Screenhots</h2>
<p>Here is an excerpt with 400% magnifications. Mouse over the pictures to see the legacy hinter.</p>
<h3>Zoomed Sans</h3>
<style type="text/css"><!-- #sanszoom a { text-decoration:none; display:block; background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/sans-normal-zoomed.png); width:400px; height:200px; } #sanszoom a:hover {background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/sans-legacy-zoomed.png); } --> </style>
<div id="sanszoom">
<a href="#">&nbsp;</a>
</div>
<h3>Zoomed Mono</h3>
<style type="text/css"><!-- #monozoom a { text-decoration:none; display:block; background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/mono-normal-zoomed.png); width:400px; height:200px; } #monozoom a:hover {background-image:url(http://martin.ankerl.com/wp-content/uploads/2009/01/mono-legacy-zoomed.png); } --> </style>
<div id="monozoom">
<a href="#">&nbsp;</a>
</div>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=197&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2009/01/22/beautiful-font-hinting-in-ubuntu-810/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Java 1.5 Collections Hierarchy Graph</title>
		<link>http://martin.ankerl.com/2009/01/05/java-15-collections-hierarchy-graph/</link>
		<comments>http://martin.ankerl.com/2009/01/05/java-15-collections-hierarchy-graph/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 12:13:26 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=116</guid>
		<description><![CDATA[Here is an inheritence graph of some of the more important Java collection classes of Java 1.5. Instantiateable classes are blue and rectangular, abstract classes are just rectangular, and interfaces are elliptic. Click on the image for a printable size: Java 1.5 Collections Hierarchy As a sidenote, have written this post almost a year ago [...]]]></description>
			<content:encoded><![CDATA[<p>Here is an inheritence graph of some of the more important Java collection classes of <a href="http://javadoc.ankerl.com/">Java 1.5</a>. Instantiateable classes are blue and rectangular, abstract classes are just rectangular, and interfaces are elliptic. Click on the image for a printable size:</p>
<p><center><a href='http://martin.ankerl.com/wp-content/uploads/2008/01/collections.png' title='Java Collections Hierarchy'><img src='http://martin.ankerl.com/wp-content/uploads/2008/01/collections-small.png' alt='Java Collections Hierarchy Small' /></a><br/><strong>Java 1.5 Collections Hierarchy</strong></center></p>
<p>As a sidenote, have written this post almost a year ago and just found it in my drafts. I have completely forgotten about it! So here it is anyways. And now I remember why I did not post it: becauseit contains only a minor subset of the collections! Thanks Artur Biesiadowski for reminding me about that&#8230;</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=116&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2009/01/05/java-15-collections-hierarchy-graph/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Approximation of sqrt(x) in Java</title>
		<link>http://martin.ankerl.com/2009/01/05/approximation-of-sqrtx-in-java/</link>
		<comments>http://martin.ankerl.com/2009/01/05/approximation-of-sqrtx-in-java/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 11:51:50 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=195</guid>
		<description><![CDATA[Yesterday I have played a bit with reinventing a fast approximation for sqrt() in Java. This might be handy with J2ME. Wikipedia has a nice article about Approximations that depend on IEEE representation. My version works, and on my Intel Dual Core with an average error of 1.57%, maximum error 4.02% it is 3.5 times [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I have played a bit with reinventing a fast approximation for <tt>sqrt()</tt> in Java. This might be handy with J2ME. Wikipedia has a nice article about <a href="http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Approximations_that_depend_on_IEEE_representation">Approximations that depend on IEEE representation</a>.  My version works, and on my Intel Dual Core with an average error of 1.57%, maximum error 4.02% it is 3.5 times faster than the original sqrt. In addition, it is very simple to improve the precision to 0.000161% average error and 0.000775% maximum error which is then 1.56 times faster than <tt>Math.sqrt()</tt>.</p>
<h2>Sourcecode</h2>
<p>I use floating point tricks based on my <a href="http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/">pow() approximation</a>. Basically I just took the pow() formula and for a^b I substitued <tt>b</tt> with <tt>0.5</tt>, then simplified this as much as possible. As it turns out the result is very simple and short. This initial approximation can be easily made more precise with <a href="http://en.wikipedia.org/wiki/Newton%27s_method">Newton&#8217;s method</a>:</p>
<pre class="brush: java;">
    public static double sqrt(final double a) {
        final long x = Double.doubleToLongBits(a) &gt;&gt; 32;
        double y = Double.longBitsToDouble((x + 1072632448) &lt;&lt; 31);

        // repeat the following line for more precision
        //y = (y + a / y) * 0.5;
        return y;
    }
</pre>
<p>Here is a comparison of the performance and accurancy versus the number of repetitions:</p>
<table width="100%">
<tr>
<th>Repetitions</th>
<th>Average<br/>error</th>
<th>Maximum<br/>error</th>
<th>Speedup</th>
</tr>
<tr>
<td>0</td>
<td>1.57%</td>
<td>4.02%</td>
<td>3.53</td>
</tr>
<tr>
<td>1</td>
<td>0.000161%</td>
<td>0.000775%</td>
<td>1.56</td>
</tr>
<tr>
<td>2</td>
<td>2.51e-8%</td>
<td>3.00e-7</td>
<td>0.838</td>
</tr>
</table>
<p>With 2 repetitions, the trouble is not worth the effort, as the approximation is already slower than the original Math.sqrt() which is more precise.</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=195&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2009/01/05/approximation-of-sqrtx-in-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazing Caching Proxy in Java</title>
		<link>http://martin.ankerl.com/2008/12/22/amazing-caching-proxy-in-java/</link>
		<comments>http://martin.ankerl.com/2008/12/22/amazing-caching-proxy-in-java/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 21:53:59 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tricks]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=184</guid>
		<description><![CDATA[Use Case Imagine you have some Java code that does lots and lots of computation. All the time intensive calculations is performed by the class SlowCalculator which implements the interface Calculator: public static interface Calculator { public String calculate(int a, String b); } public static void main(String[] args) { Calculator c = new SlowCalculator(); // [...]]]></description>
			<content:encoded><![CDATA[<h2>Use Case</h2>
<p>Imagine you have some Java code that does lots and lots of computation. All the time intensive calculations is performed by the class <tt>SlowCalculator</tt> which implements the interface <tt>Calculator</tt>:</p>
<pre class="brush: java;">
public static interface Calculator {
    public String calculate(int a, String b);
}

public static void main(String[] args) {
    Calculator c = new SlowCalculator();
    // call c.calculate() a lot of times here...
}
</pre>
<p>You notice that <tt>calculate()</tt> is often called with the same parameters which lead to the exact same result (<tt>SlowCalculator</tt> is stateless). This means it is possible to cache values so there&#8217;s no need to recompute. Using the generic CachingProxy&trade; described below, you can create a cached proxy for any class with just one single line of code:</p>
<pre class="brush: java;">
// ...

public static void main(String[] args) {
    Calculator c = new SlowCalculator();
    c = CachedProxy.create(Calculator.class, c);
    // call c.calculate() a lot of times here...
}
</pre>
<p>That&#8217;s it, and the application is blazingly fast again.</p>
<p><strong>UPDATE</strong>: Support for <tt>null</tt> values, transparently handles exceptions, better hash, nullpointer-bugfix.</p>
<p><strong>UPDATE</strong>: Here is an article &#8220;<a href="http://www.onjava.com/pub/a/onjava/2003/08/20/memoization.html">Memoization in Java Using Dynamic Proxy Classes</a>&#8221; that does (almost) exactly the same as this code.</p>
<p><span id="more-184"></span></p>
<h2>How To Do This</h2>
<p>All this sounds nice, but can you do this in java? Turns out you can and it is not that difficult either. The feature that makes it all possible is <a href="http://java.sun.com/j2se/1.4.2/docs/guide/reflection/proxy.html">Dynamic Proxy</a>. With it you can implement interfaces <em>at runtime</em>. You take an interface, create a proxy for it with <tt><a href="http://java.sun.com/javase/6/docs/api/java/lang/reflect/Proxy.html">Proxy</a>.newProxyInstance(...)</tt>, supply an <a href="http://java.sun.com/javase/6/docs/api/java/lang/reflect/InvocationHandler.html">InvocationHandler</a> that implements the <tt><a href="http://java.sun.com/javase/6/docs/api/java/lang/reflect/InvocationHandler.html#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])">invoke()</a></tt> method, and you are done.</p>
<p>The code for the <tt>CachedProxy.create()</tt> method is this:</p>
<pre class="brush: java;">
    /**
     * Creates an intermediate proxy object that uses cached results if
     * available, otherwise calls the given code.
     *
     * @param &lt;T&gt;
     *            Type of the class.
     * @param cl
     *            The interface for which the proxy should be created.
     * @param code
     *            The actual calculation code that should be cached.
     * @return The proxy.
     */
    @SuppressWarnings(&quot;unchecked&quot;)
    public static &lt;T&gt; T create(final Class&lt;T&gt; cl, final T code) {
        // create the cache
        final Map&lt;Args, Object&gt; argsToOutput = new HashMap&lt;Args, Object&gt;();

        // proxy for the interface T
        return (T) Proxy.newProxyInstance(cl.getClassLoader(), new Class&lt;?&gt;[] { cl }, new InvocationHandler() {

            @Override
            public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
                final Args input = new Args(method, args);
                Object result = argsToOutput.get(input);
                // check containsKey to support null values
                if (result == null &amp;&amp; !argsToOutput.containsKey(input)) {
                    // make sure exceptions are handled transparently
                    try {
                        result = method.invoke(code, args);
                        argsToOutput.put(input, result);
                    } catch (InvocationTargetException e) {
                        throw e.getTargetException();
                    }
                }
                return result;
            }
        });
    }
</pre>
<ol>
<li>First I create a <tt>HashMap</tt> that is the cache for the return values. I have written a class <tt>Args</tt> (omitted here) that is as the key to map from the method and the parameters to the cached output.
<li>A Proxy is created for the interface <tt>cl</tt>, with an InvocationHandler that does all the magic.
<li>The magic is actually very simple: If there is no cached result already available (line 25), perform the computation (line 26) and store the result in the map, then return the result.
</ol>
<h2>Download</h2>
<p>You can get the full code at my github repository:</p>
<ul>
<li>
<a href="http://github.com/martinus/java-playground/tree/master/src/java/com/ankerl/proxy/CachedProxy.java">CachedProxy</a>
</li>
</ul>
<h2>Benchmarks</h2>
<p>In my benchmark I can run about 8 million calls per secons via the cached proxy. That&#8217;s not too bad, given all the additional overhead with reflection and the HashMap.</p>
<p>Do you know of any way to improve this? Any ideas or suggestions are welcome!</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=184&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2008/12/22/amazing-caching-proxy-in-java/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Two Word Anagram Finder Algorithm (in Ruby)</title>
		<link>http://martin.ankerl.com/2008/08/09/two-word-anagram-finder-algorithm/</link>
		<comments>http://martin.ankerl.com/2008/08/09/two-word-anagram-finder-algorithm/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 19:32:30 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[benchmark]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=156</guid>
		<description><![CDATA[Today I have got some sourcecode for you. There is a little programming challenge named The Self-Documenting Code Contest that is quite fun, they try to find the cleanest and easiest to read code for this task: Write a program that generates all two-word anagrams of the string &#8220;documenting&#8221;. Here&#8217;s a word list you might [...]]]></description>
			<content:encoded><![CDATA[<p>Today I have got some sourcecode for you. There is a little programming challenge named <a href="http://selfexplanatorycode.blogspot.com/">The Self-Documenting Code Contest</a> that is quite fun, they try to find the cleanest and easiest to read code for this task:</p>
<blockquote><p>
Write a program that generates all two-word anagrams of the string &#8220;documenting&#8221;. Here&#8217;s a word list you might want to use: <a href='http://martin.ankerl.com/wp-content/uploads/2008/08/wordlist.zip'>wordlist.zip</a>.</p>
<p>When you&#8217;re done, send the results to <a href="mailto:selfdocumenting@hotmail.com">selfdocumenting@hotmail.com</a>.</p>
<p>Good luck!
</p></blockquote>
<p>So this caught my interest and i wrote a little entry in Ruby that is 23 lines long with whitespace and very nice to read. But I won&#8217;t show you this code until the contest is over, and this is not the reason for this post. The reason is, that the nice version takes about 2 seconds, and somebody else has coded a Python solution that takes only 1 second (I have no idea what his code looks like). This post is about a fast anagram finding algorithm, and how I developed this algorithm. The final result takes about 0.11 seconds.</p>
<h1>Algorithm</h1>
<p>The most basic algorithm has two phases:</p>
<ol>
<li>Read in the file
<li>Build all combinations of two words and compare the letter count with the query.
</ol>
<p>Building the combinations is usually done with two nested loops and takes O(n^2) runtime. This is slow, so I have added another step in between:</p>
<h2>Idea #1: Filter out Candidate Words</h2>
<p>The second step is really slow, but it would be a lot faster if it has to handle less words. So I wrote a little filtering step that lets only words through which are made out of the same letters as the query word.</p>
<p>For example when the query is <tt>documenting</tt>, the word <tt>men</tt> or <tt>go</tt> and even <tt>too</tt> are extracted, even if the number of letters might not match. But that&#8217;s not important, what is important is that the number of possible words are reduced a lot, and so the next phase is faster.</p>
<h2>Idea #2: Use a Commutative Hashing Function</h2>
<p>String comparisons are slow. To common way to find out if the strings <tt>coming</tt> with <tt>tuned</tt> is an anagram of the word <tt>documenting</tt> is to sort the letters and make a comparison, like this:</p>
<pre class="brush: ruby;">
irb(main):003:0&gt; &quot;documenting&quot;.unpack(&quot;c*&quot;).sort.pack(&quot;c*&quot;)
=&gt; &quot;cdegimnnotu&quot;
irb(main):004:0&gt; (&quot;coming&quot; + &quot;tuned&quot;).unpack(&quot;c*&quot;).sort.pack(&quot;c*&quot;)
=&gt; &quot;cdegimnnotu&quot;
</pre>
<p>The strings are equal, so we have a match. But this comparison is terribly slow! What&#8217;s worse, the computations have to be redone for each match. It would be much better to just compare hash values, and find a hash function to quickly check if we might have a match, and only do the string comparison when the hash check matches. The hash has to be good enough that we don&#8217;t have too much false positives (hashes are equal but the real comparisons not) to get a speed advantage. So why not just sum up all the letters bytes? </p>
<pre class="brush: ruby;">
irb(main):005:0&gt; &quot;documenting&quot;.sum
=&gt; 1181
irb(main):006:0&gt; &quot;coming&quot;.sum + &quot;tuned&quot;.sum
=&gt; 1181
</pre>
<p>Ruby&#8217;s <a href="http://www.ruby-doc.org/core/classes/String.html#M000857">String#sum</a> does exactly this. we can now precalculate the sum for each word, and to find a match we just add the two hashes and compare the result to the query&#8217;s hash:</p>
<pre class="brush: ruby;">
irb(main):007:0&gt; query=&quot;documenting&quot;; first=&quot;coming&quot;; second=&quot;tuned&quot;
=&gt; &quot;tuned&quot;
irb(main):008:0&gt; first.sum + second.sum == query.sum
=&gt; true
</pre>
<p>When this very quick check returns true, we have to do the string comparison to be absolutely sure it is a match. This considerably speeds up the whole program, but it is still O(n^2).</p>
<h2>Idea #3: Reformulate Problem</h2>
<p>Now here comes the trickiest and coolest part. Since Idea #2 the slowest part is matching the numbers, with still quadratic complexity. But the hard task is not anagram finding any more, we have reduced it to finding two hashes that combined have the same hash as the query. We can reformulate this problem into something completely detached from the anagram problem:</p>
<blockquote><p>
Given a list of numbers, find all combination of two numbers that add up to a given number
</p></blockquote>
<p>When we concentrate on just this problem and ignore the rest, we might come up with a better way of doing things.</p>
<p>I came up with a fast solution, described below. Somebody posted a better solution that is both faster and simpler, if you want just this final solution <a href="#idea4">skip ahead to Idea #4</a> as the following description is outdated.</p>
<p>It clearly looks stupid to just try all combinations to add the numbers.<br />
So lets sort them first. Quicksort is fast, especially with numbers, so no worries here. Now consider a list of numbers like this example:</p>
<pre>1   3   7   10   10   12   17   20   22   23   24   24   25   26   30</pre>
<p>Find all the combinations of two number that add up to 27. They are</p>
<ul>
<li>1 + 26 = 27
<li>3 + 24 = 27
<li>7 + 20 = 27
<li>10 + 17 = 27
<li>10 + 17 = 27 (a second time)
</ul>
<p>You can detect a pattern here: the first number always increases, the second number always decreases! We can now formulate an algorithm for this:</p>
<p>We can have two pointers to the array, one starting from the left side, the other starting from the right side. When the numbers behind the pointers add up to a bigger result than the query (e.g. 1 + 30 = 31), we decrease the right pointer to find a smaller combination (1 + 26 = 27). When the sums are too small (1 + 25 = 26), we move the left pointer to the right (3 + 25 = 28).</p>
<p>This way we walk through the whole array in O(n) time and the sum of the pointers is always kept as close the the desired result as possible. When the pointers meet each other, we can stop the whole process or otherwise we would just reverse the words. </p>
<p>This algorithm gets a bit more complicated when you consider that we might have lots of numbers in it that are equal, whenever this happens you have to fall back into an O(n^2) matching algorithm for just this section.</p>
<h2><a name="idea4"></a>Idea #4: Use Hash directly</h2>
<p><b>UPDATE</b> Scrap the implementation in idea #3. A blog post here from a reader of this article posted a way to do this really in O(n), without any sorting which is O(n*log(n)). The idea is to use a hashmap that maps from the hash key of the word to its matches:</p>
<pre class="brush: ruby;">
M = {}
S = the target sum
for each element e in the list
      if M[S-e] exists? (e,S-e) is a pair
      add e to the M
</pre>
<p>Just use a Hashmap that maps from the cummulative hash of a word to a list of words that have the same hash. Whenever a new word is added, get the list of words that is stored under <tt>query.sum - current_word.sum</tt>. When the hashes are the same we just have to create a list of all the matches under this key, and check each of the matches sequentially for equality. This is just normal hash collision handling through a linked list. That&#8217;s very simple and works like a charm.</p>
<p>I have revised the code, it got both simpler and faster. That&#8217;s a win-win situation, wohoo! </p>
<h1>The Sourcecode</h1>
<p>I hope the code is understandable now with the above explanation. If you have any questions or ideas, please share them here!</p>
<pre class="brush: ruby;">
#!/usr/bin/ruby

# created by Martin Ankerl http://martin.ankerl.com/

class String
	# creates an array of characters
	def letters
		unpack(&quot;c*&quot;)
	end
end

class Array
	# converts an array of letters back into a String
	def word
		pack(&quot;c*&quot;)
	end
end

query = &quot;documenting&quot;
query_letters_sorted = query.letters.sort
txt = File.read('wordlist.txt').downcase

# to quickly check if a letter is part of the query word
used_letters = Array.new(256, nil)
query_letters_sorted.each do |letter|
	used_letters[letter] = true
end

# Maps from cummulative hash of a word to a list of words that have this hash code.
hashToWords = Hash.new do |hash, key|
	hash[key] = Array.new
end

query_hash = query.sum

prev = 0
txt_size = txt.size
separator = 10
idx = txt.index(separator, prev)
while prev &lt; txt_size

	letter_idx = prev

	# no need to check end of word because it is \n
	# which is not part of the word anyways
	while used_letters[txt[letter_idx]]
		letter_idx += 1
	end

	# ignore word if the above quick check fails
	if letter_idx == idx
		word = txt[prev, idx-prev]

		# check all key matches
		key = word.sum
		hashToWords[query_hash - key].each do |other_word|
			if (word.letters + other_word.letters).sort == query_letters_sorted
				puts &quot;#{word} #{other_word}&quot;
				puts &quot;#{other_word} #{word}&quot;
			end
		end

		# insert word
		hashToWords[key] &lt;&lt; word
	end

	prev = idx + 1

	# no need to check end of file because we have to end with new line
	idx = txt.index(separator, prev)
end
</pre>
<p>When you rewrite the algorithm in C++ or Java or Python I am sure it will be faster than this one. But this is not the point of this post. The point is, &#8220;The Best Optimizer is between Your Ears&#8221; (Michael Abrash, <a href="http://www.byte.com/abrash/">Graphics Programming Black Book</a>).</p>
<p>Have fun!</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=156&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2008/08/09/two-word-anagram-finder-algorithm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Job Interview Question: Sorting Records</title>
		<link>http://martin.ankerl.com/2008/05/27/job-interview-question-sorting-records/</link>
		<comments>http://martin.ankerl.com/2008/05/27/job-interview-question-sorting-records/#comments</comments>
		<pubDate>Tue, 27 May 2008 11:22:36 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=154</guid>
		<description><![CDATA[Dev102.com has a few postings about interesting job interview question. His fifth challenge is this neat task: You are asked to sort a collection of records. The records are stored in a file on the disk, and the size of the file is much bigger than available memory you can work with. Assume a record [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dev102.com/">Dev102.com</a> has a few postings about interesting job interview question. <a href="http://www.dev102.com/2008/05/26/a-programming-job-interview-challenge-5-records-sorting/">His fifth challenge</a> is this neat task:</p>
<blockquote><p>You are asked to sort a collection of records. The records are stored in a file on the disk, and the size of the file is much bigger than available memory you can work with. Assume a record size is 10 bytes and file size is 1GB. you read and write data to/from disk in units of pages where each page is 1KB big. You have few (less than 10) available pages of physical memory. Assume you are given a method to compare two records.</p></blockquote>
<p>Here is how I would approach this problem. It was just a quick direct writeup of the thoughts that popped up in my mind:</p>
<ol>
<li>Easiest solution: use Unix&#8217;s <a href="http://www.softpanorama.org/Tools/sort.shtml">sort</a> tool, with <tt>-S</tt> option to specify max memory usage.
<li>If this is not allowed, the second easiest solution is to implement a simple <a href="http://en.wikipedia.org/wiki/Merge_sort">Merge sort</a>, and use multiple passes with one temporary file until everything is sorted.
<li>If speed is an issue, you can have a pre-pass before the merge sort that loads as much data junks into memory as possible, sorts this junk with <a href="http://en.wikipedia.org/wiki/Quick_Sort">Quicksort</a>, and write each sorted junk back into the temporary file.
<li>If you want to go even faster, you can go crazy with 10 passes at once and use a <a href="http://en.wikipedia.org/wiki/Sorting_network">sorting network</a> to merge these 10 streams. Here comes the point where you should benchmark before coding, because caching, harddisk properties etc. might have an enormous influence.
</ol>
<p>I believe this is a quite reasonable approach. It is important to have multiple solutions for a problem to select from, then you can choose the simplest one that works. This is the <a href="http://martin.ankerl.com/2006/01/25/software-design-principles/">Do The Simplest Thing That Could Possibly Work (DTSTTCPW)</a> &#8211; Principle. This approach is very important in test driven development, and in general a big part of the <a href="http://en.wikipedia.org/wiki/Scientific_method">scientific method</a> (see also <a href="http://en.wikipedia.org/wiki/Occam's_Razor">Occams&#8217; Razor</a>). If the simplest solution is enough, that&#8217;s great! If this is not enough, you can try again with the second simplest solution. Repeat until the problem is solved <img src='http://martin.ankerl.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>I have use this approach for a long time now, and its really productive. Never go for cool and interesting but complex solutions just because they are cool and interesting. These kind of solutions are just for your own ego. There are even <a href="http://www.codinghorror.com/blog/archives/000584.html">10 commandments for egoless programming</a>.</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=154&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2008/05/27/job-interview-question-sorting-records/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>New Release of XDCC-Fetch</title>
		<link>http://martin.ankerl.com/2007/11/04/new-release-of-xdcc-fetch/</link>
		<comments>http://martin.ankerl.com/2007/11/04/new-release-of-xdcc-fetch/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 14:41:09 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[freeware]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[xdcc]]></category>
		<category><![CDATA[xdcc-fetch]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=99</guid>
		<description><![CDATA[XDCC-Fetch is a nice little application written in Ruby that is able to download from XDCC bots on IRC. I have updated it to work with fox 1.6, so this should work with the recent Ruby version. Screenshot Unfortunately I don&#8217;t really have the time nor the interest to continue development for XDCC-Fetch. Please contact [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xdccfetch.sourceforge.net/">XDCC-Fetch</a> is a nice little application written in Ruby that is able to download from <a href="http://en.wikipedia.org/wiki/XDCC">XDCC</a> bots on IRC. I have updated it to work with fox 1.6, so this should work with the recent Ruby version.</p>
<h1>Screenshot</h1>
<p><center><br />
<img src="/files/xdcc-fetch.png" width="527" height="488"><br />
</center></p>
<p>Unfortunately I don&#8217;t really have the time nor the interest to continue development for XDCC-Fetch. Please <a href="mailto:martin.ankerl@gmail.com">contact me</a> if you are interested to continue development.</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=99&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2007/11/04/new-release-of-xdcc-fetch/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Optimized pow() approximation for Java, C / C++, and C#</title>
		<link>http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/</link>
		<comments>http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 22:48:08 +0000</pubDate>
		<dc:creator>Martin Ankerl</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[tricks]]></category>
		<category><![CDATA[floating point]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://martin.ankerl.com/?p=96</guid>
		<description><![CDATA[I have already written about approximations of e^x, log(x) and pow(a, b) in my post Optimized Exponential Functions for Java. Now I have more In particular, the pow() function is now even faster, simpler, and more accurate. Without further ado, I proudly give you the brand new approximation: Approximation of pow() in Java public static [...]]]></description>
			<content:encoded><![CDATA[<p>I have already written about approximations of <tt>e^x</tt>, <tt>log(x)</tt> and <tt>pow(a, b)</tt> in my post <a href="http://martin.ankerl.com/2007/02/11/optimized-exponential-functions-for-java/">Optimized Exponential Functions for Java</a>. Now I have more <img src='http://martin.ankerl.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  In particular, the <tt>pow()</tt> function is now even faster, simpler, and more accurate. Without further ado, I proudly give you the brand new approximation:</p>
<h1>Approximation of pow() in Java</h1>
<pre class="brush: java;">public static double pow(final double a, final double b) {
    final int x = (int) (Double.doubleToLongBits(a) &gt;&gt; 32);
    final int y = (int) (b * (x - 1072632447) + 1072632447);
    return Double.longBitsToDouble(((long) y) &lt;&lt; 32);
}</pre>
<p>This is really very compact. The calculation only requires 2 shifts, 1 mul, 2 add, and 2 register operations. That&#8217;s it! In my tests it usually within an error margin of 5% to 12%, in extreme cases sometimes up to 25%. A careful analysis is left as an exercise for the reader. This is very usable for in e.g. <a href="http://en.wikipedia.org/wiki/Metaheuristic">metaheuristics</a> or <a href="http://en.wikipedia.org/wiki/Artificial_neural_network">neural nets</a>.</p>
<p>I use Linux, Java 1.6.0-b105 with the server VM, and execute the benchmark with this command:
<pre>sudo nice -n -20 java -cp . -server PowTest</pre>
<p> The approximation is <b>27 times faster</b> than Math.pow() on my Pentium-M. On a Pentium 4 it is <b>41 times faster</b>. Unfortunately, microbenchmarks are difficult to do in Java, so your mileage may vary. You can download the benchmark <a href="/files/PowTest.java">PowTest.java</a> and have a look, I have tried to prevent overoptimization while still having a low overhead.</p>
<h1>Approximation of pow() in C and C++</h1>
<pre class="brush: cpp;">double pow(double a, double b) {
    int tmp = (*(1 + (int *)&amp;a));
    int tmp2 = (int)(b * (tmp - 1072632447) + 1072632447);
    double p = 0.0;
    *(1 + (int * )&amp;p) = tmp2;
    return p;
}</pre>
<p>Compiled on my Pentium-M with gcc 4.1.2:
<pre>gcc -O3 -march=pentium-m -fomit-frame-pointer -fno-strict-aliasing</pre>
<p>This version is <b>7.8 times</b> faster than pow() from the standard library.</p>
<p><strong>WARNING</strong>! you HAVE to use the <tt>-fno-strict-aliasing</tt> option, or this does not work!</p>
<h1>Approximation of pow() in C#</h1>
<p>Jason Jung has posted a port of the this code to C#: </p>
<pre class="brush: csharp;">public static double PowerA(double a, double b) {
  int tmp = (int)(BitConverter.DoubleToInt64Bits(a) &gt;&gt; 32);
  int tmp2 = (int)(b * (tmp - 1072632447) + 1072632447);
  return BitConverter.Int64BitsToDouble(((long)tmp2) &lt;&lt; 32);
}</pre>
<h1>How the Approximation was Developed</h1>
<p>It is quite impossible to understand what is going on in this function, it just magically works. To shine a bit more light on it, here is a detailed description how I have developed this.</p>
<h2>Approximation of e^x</h2>
<p>As described <a href="http://martin.ankerl.com/2007/02/11/optimized-exponential-functions-for-java/">here</a>, the paper &#8220;<a href="http://citeseer.ist.psu.edu/schraudolph98fast.html">A Fast, Compact Approximation of the Exponential Function</a>&#8221; develops a C macro that does a good job at exploiting the IEEE 754 floating-point representation to calculate <tt>e^x</tt>. This macro can be transformed into Java code straightforward, which looks like this:</p>
<pre class="brush: java;">public static double exp(double val) {
    final long tmp = (long) (1512775 * val + (1072693248 - 60801));
    return Double.longBitsToDouble(tmp &lt;&lt; 32);
}</pre>
<h2>Use Exponential Functions for a^b</h2>
<p>Thanks to the power of math, we know that <tt>a^b</tt> can be transformed like this:</p>
<ol>
<li>Take exponential
<pre>a^b = e^(ln(a^b))</pre>
<li>Extract b
<pre>a^b = e^(ln(a)*b)</pre>
</ol>
<p>Now we have expressed the pow calculation with <tt>e^x</tt> and <tt>ln(x)</tt>. We already have the <tt>e^x</tt> approximation, but no good <tt>ln(x)</tt>. The <a href="http://martin.ankerl.com/2007/02/11/optimized-exponential-functions-for-java/">old approximation</a> is very bad, so we need a better one. So what now?</p>
<h2>Approximation of ln(x)</h2>
<p>Here comes the big trick: Rember that we have the nice <tt>e^x</tt> approximation? Well, <tt>ln(x)</tt> is exactly the inverse function! That means we just need to transform the above approximation so that the output of <tt>e^x</tt> is transformed back into the original input.</p>
<p>That&#8217;s not too difficult. Have a look at the above code, we now take the output and move backwards to undo the calculation. First reverse the shift:</p>
<pre>final double tmp = (Double.doubleToLongBits(val) >> 32);</pre>
<p>Now solve the equation
<pre>tmp = (1512775 * val + (1072693248 - 60801))</pre>
<p> for val:</p>
<ol>
<li>The original formula
<pre>tmp = (1512775 * val + (1072693248 - 60801))</pre>
<li>Perform subtraction
<pre>tmp = 1512775 * val + 1072632447</pre>
<li>Bring value to other side
<pre>tmp - 1072632447 = 1512775 * val</pre>
<li>Divide by factor
<pre>(tmp - 1072632447) / 1512775 = val</pre>
<li>Finally, val on the left side
<pre>val = (tmp - 1072632447) / 1512775</pre>
</ol>
<p>Voíla, now we have a nice approximation of <tt>ln(x)</tt>:</p>
<pre class="brush: java;">public double ln(double val) {
    final double x = (Double.doubleToLongBits(val) &gt;&gt; 32);
    return (x - 1072632447) / 1512775;
}</pre>
<h2>Combine Both Approximations</h2>
<p>Finally we can combine the two approximations into <tt>e^(ln(a) * b)</tt>:</p>
<pre class="brush: java;">public static double pow1(final double a, final double b) {
    // calculate ln(a)
    final double x = (Double.doubleToLongBits(a) &gt;&gt; 32);
    final double ln_a = (x - 1072632447) / 1512775;

    // ln(a) * b
    final double tmp1 = ln_a * b;

    // e^(ln(a) * b)
    final long tmp2 = (long) (1512775 * tmp1 + (1072693248 - 60801));
    return Double.longBitsToDouble(tmp2 &lt;&lt; 32);
}</pre>
<p>Between the two shifts, we can simply insert the <tt>tmp1</tt> calculation into the tmp2 calculation to get</p>
<pre class="brush: java;">public static double pow2(final double a, final double b) {
    final double x = (Double.doubleToLongBits(a) &gt;&gt; 32);
    final long tmp2 = (long) (1512775 * (x - 1072632447) / 1512775 * b + (1072693248 - 60801));
    return Double.longBitsToDouble(tmp2 &lt;&lt; 32);
}</pre>
<p>Now simplify <tt>tmp2</tt> calculation:</p>
<ol>
<li>The original formula
<pre>tmp2 = (1512775 * (x - 1072632447) / 1512775 * b + (1072693248 - 60801))</pre>
<li>We can drop the factor <tt>1512775</tt>
<pre>tmp2 = (x - 1072632447) * b + (1072693248 - 60801)</pre>
<li>And finally, calculate the substraction
<pre>tmp2 = b * (x - 1072632447) + 1072632447</pre>
</ol>
<h2>The Result</h2>
<p>That&#8217;s it! Add some casts, and the complete function is the same as above.</p>
<pre class="brush: java;">public static double pow(final double a, final double b) {
    final int tmp = (int) (Double.doubleToLongBits(a) &gt;&gt; 32);
    final int tmp2 = (int) (b * (tmp - 1072632447) + 1072632447);
    return Double.longBitsToDouble(((long) tmp2) &lt;&lt; 32);
}</pre>
<p>This concludes my little tutorial on microoptimization of the pow() function. If you have come this far, I congratulate your presistence <img src='http://martin.ankerl.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>UPDATE</strong> Recently there several other approximative <tt>pow</tt> calculation methods have been developed, here are some others that I have found through <a href="http://www.reddit.com/r/programming/comments/8kftl/fast_pow_approximation_in_java_and_c/">reddit</a>:</p>
<ul>
<li><a href="http://www.hxa.name/articles/content/fast-pow-adjustable_hxa7241_2007.html">Fast pow() With Adjustable Accuracy</a> &#8212; This looks quite a bit more sophisticated and precise than my approximation. Written in C and for float values. A Java port should not be too difficult.
</li>
<li><a href="http://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html">Fast SSE2 pow: tables or polynomials?</a> &#8212; Uses <a href="http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions">SSE </a> operation and seems to be a bit faster than the table approach from the link above with the potential to scale better when due to less cache usage.
</li>
</ul>
<p>Please post what you think about this!</p>
<div style='clear:both'></div><img src="http://martin.ankerl.com/?ak_action=api_record_view&id=96&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
