<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Paul Bergeron]]></title>
  <link href="http://pauldbergeron.com/atom.xml" rel="self"/>
  <link href="http://pauldbergeron.com/"/>
  <updated>2021-05-27T16:46:45+02:00</updated>
  <id>http://pauldbergeron.com/</id>
  <author>
    <name><![CDATA[Paul Bergeron]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Setting Up Disco - A JVM-free Alternative To Hadoop]]></title>
    <link href="http://pauldbergeron.com/articles/setting-up-disco-a-jvm-free-alternative-to-hadoop.html"/>
    <updated>2014-04-19T22:46:00+02:00</updated>
    <id>http://pauldbergeron.com/articles/setting-up-disco-a-jvm-free-alternative-to-hadoop</id>
    <content type="html"><![CDATA[<p>The <a href="http://discoproject.org/">Disco</a> Project is a re-implmentation of MapReduce, but instead of using the JVM and the Hadoop Ecosystem, Disco takes a different approach. Instead, Disco uses a unique hybrid of Python and Erlang. This intrigues me because this brings Python based tools like <a href="http://scikit-learn.org/stable/">Scikit-learn</a> and <a href="http://www.numpy.org/">NumPy</a> to a MapReduce framework.</p>

<!-- more -->


<p>Disco also has it&rsquo;s own merits that allow it to stand toe-to-toe with it&rsquo;s much more widely known and slightly older brother Hadoop. All the standard facilities are here, a distributed file system (DDFS), a task tracker of sorts, but without the verbrositiy of the JVM, and also, a much more streamlined setup process.</p>

<p>I hit a couple of snags following the guide in the <a href="http://disco.readthedocs.org/en/latest/start/install.html">documentation</a>, which is why I decided to write this post. However, this step by step will largely echo the guide, but be targeted towards getting a local development install up and running. Also, this is for OS X systems only, so we&rsquo;ll be using homebrew for package installs.</p>

<p>First, grab some dependancies.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew install python erlang lighttpd varnish
</span></code></pre></td></tr></table></div></figure>


<p>Make sure you have a local SSH server running as well. Thankfully, OS X comes with one, make sure you have it running by double checking System Preferences, Sharing, and making sure the Remote Login service is enabled.</p>

<p>Verify that your SSH key is also configured correctly and is working by doing <code>ssh localhost</code> and making sure you aren&rsquo;t asked for a password.</p>

<p>If that succeeds without prompting for a password, then you should proceed. Setting up SSH keys can get pretty tricky and there are already a lot of guides out there for that, so I&rsquo;ll skip over it. If you need help, try <a href="http://osxdaily.com/2012/05/25/how-to-set-up-a-password-less-ssh-login/">here</a>.</p>

<p>Add the following to your <code>~/bash_profile</code>, and <code>source ~/bash_profile</code> or restart your shell.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">DISCO_HOME</span><span class="o">=</span>/Users/<span class="nv">$USER</span>/disco
</span><span class='line'><span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="nv">$PATH</span>:<span class="nv">$DISCO_HOME</span>/bin
</span></code></pre></td></tr></table></div></figure>


<p>Here are the commands to download and build Disco in a way that works well for development and local testing, with homebrew&rsquo;s packages. This also installs the <code>master</code> branch, which is considered stable for production. The newer branch <code>develop</code> does work, and has a lot of improvements, but there&rsquo;s a larger chance of hitting a bug.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> ~/
</span><span class='line'>git clone git://github.com/discoproject/disco.git <span class="nv">$DISCO_HOME</span>
</span><span class='line'><span class="nb">cd</span> <span class="nv">$DISCO_HOME</span>
</span><span class='line'>git checkout master <span class="c"># Skip this step to live on the edge</span>
</span><span class='line'>make
</span><span class='line'><span class="nb">cd </span>lib <span class="o">&amp;&amp;</span> python setup.py install <span class="o">&amp;&amp;</span> <span class="nb">cd</span> ..
</span></code></pre></td></tr></table></div></figure>


<p>If you followed all the steps correctly, <code>disco nodaemon</code> should start disco without error.</p>

<p>In another shell, running <code>python $DISCO_HOME/examples/util/count_words.py</code> will confirm your setup by running the class of all MapReduce jobs, the Word Count.</p>

<p>That&rsquo;s it, you&rsquo;re all setup, happy hacking on Disco!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[From Zero To Om]]></title>
    <link href="http://pauldbergeron.com/articles/from-zero-to-om.html"/>
    <updated>2014-01-08T20:24:00+01:00</updated>
    <id>http://pauldbergeron.com/articles/from-zero-to-om</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/swannodette/om">Om</a> by <a href="http://swannodette.github.io/">swannodette</a> is a ClojureScript interface to <a href="http://facebook.github.io/react/">Facebook&rsquo;s React</a>. It&rsquo;s power is that it can create UIs that are easily snapshottable, rewindable, and all with great performance.</p>

<p>Getting to a good starting point with ClojureScript can be a little complicated, so here&rsquo;s a step-by-step process for going from a clean slate to a working development enviroment.</p>

<!-- more -->


<p>Presuming leiningen installed, getting a ClojureScript app template is easy.</p>

<p>Just use <a href="http://www.mihneadb.net/post/cljs-webapp-a-leiningen-template-for-clojurescript-webapps/">mihneadb&rsquo;s</a> ClojureScript template.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>lein new cljs-webapp PROJECT-NAME
</span><span class='line'><span class="nb">cd </span>PROJECT-NAME
</span></code></pre></td></tr></table></div></figure>


<p>Add Om to the dependencies in <code>project.clj</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="nv">...</span>
</span><span class='line'>  <span class="ss">:dependencies</span> <span class="p">[[</span><span class="nv">org.clojure/clojure</span> <span class="s">&quot;1.5.1&quot;</span><span class="p">]</span>
</span><span class='line'>                 <span class="p">[</span><span class="nv">org.clojure/clojurescript</span> <span class="s">&quot;0.0-2138&quot;</span><span class="p">]</span>
</span><span class='line'>                 <span class="p">[</span><span class="nv">om</span> <span class="s">&quot;0.1.5&quot;</span><span class="p">]]</span>
</span><span class='line'><span class="nv">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then edit <code>resources/public/index.html</code> and add a div, and React to the <code>&lt;body&gt;</code> element:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>...
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;some-id&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://fb.me/react-0.8.0.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;js/goog/base.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<p>Now, time for some ClojureScript, edit <code>core.cljs</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="kd">ns </span><span class="nv">project-name.core</span>
</span><span class='line'>  <span class="p">(</span><span class="ss">:require</span> <span class="p">[</span><span class="nv">om.core</span> <span class="ss">:as</span> <span class="nv">om</span> <span class="ss">:include-macros</span> <span class="nv">true</span><span class="p">]</span>
</span><span class='line'>            <span class="p">[</span><span class="nv">om.dom</span> <span class="ss">:as</span> <span class="nv">dom</span> <span class="ss">:include-macros</span> <span class="nv">true</span><span class="p">]))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">widget</span> <span class="p">[</span><span class="nv">data</span> <span class="nv">owner</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">om/component</span>
</span><span class='line'>    <span class="p">(</span><span class="nf">dom/div</span> <span class="nv">nil</span> <span class="s">&quot;Hello world!&quot;</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">om/root</span> <span class="p">{}</span> <span class="nv">widget</span> <span class="p">(</span><span class="nf">.getElementById</span> <span class="nv">js/document</span> <span class="s">&quot;some-id&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Last step, let&rsquo;s get it on the browser:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>lein cljsbuild once dev
</span><span class='line'>ruby -run -ehttpd resources/public -p8080 <span class="c"># Just hosts the current path on the given port</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then just open <a href="http://localhost:8080/">http://localhost:8080/</a> in your browser, and you&rsquo;ve got a working Om ClojureScript app running!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Event Machine In Normal Ruby (or Rails) Apps]]></title>
    <link href="http://pauldbergeron.com/articles/event-machine-in-normal-ruby-or-rails-apps.html"/>
    <updated>2013-05-28T19:40:00+02:00</updated>
    <id>http://pauldbergeron.com/articles/event-machine-in-normal-ruby-or-rails-apps</id>
    <content type="html"><![CDATA[<p>I learned a new trick from my friend and co-worker <a href="https://twitter.com/DAddYE">@DaDDYe</a>, author of the awesome <a href="http://www.padrinorb.com/">Padrino</a> framework, on how to use <a href="http://rubyeventmachine.com/">EventMachine</a> in normal Ruby or Rails applications.</p>

<p>In most EventMachine apps, you have to place everything inside of a EventMachine.run block, i.e.:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;eventmachine&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">EM</span><span class="o">.</span><span class="n">run</span> <span class="k">do</span>
</span><span class='line'>  <span class="c1"># ... your app here</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This usually means that concurrent Ruby apps have to be designed so from the start. However, you can get around this limitation.</p>

<!-- more -->


<p>You can start EventMachine in a seperate thread, and then you can use EventMachine calls in your synchronous program. There&rsquo;s some setup and teardown to make sure everything works:</p>

<figure class='code'><figcaption><span>eventmachine_threads.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;eventmachine&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Setup EventMachine</span>
</span><span class='line'><span class="no">Thread</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="no">EM</span><span class="o">.</span><span class="n">run</span>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Catch signals to ensure a clean shutdown of EventMachine</span>
</span><span class='line'><span class="nb">trap</span><span class="p">(</span><span class="ss">:INT</span><span class="p">)</span> <span class="p">{</span> <span class="no">EM</span><span class="o">.</span><span class="n">stop</span> <span class="p">}</span>
</span><span class='line'><span class="nb">trap</span><span class="p">(</span><span class="ss">:TERM</span><span class="p">){</span> <span class="no">EM</span><span class="o">.</span><span class="n">stop</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Wait for the reactor to start</span>
</span><span class='line'><span class="k">while</span> <span class="ow">not</span> <span class="no">EM</span><span class="o">.</span><span class="n">reactor_running?</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Setup done! Now you can use any EventMachine code here!</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Examples:</span>
</span><span class='line'><span class="n">channel</span> <span class="o">=</span> <span class="ss">EM</span><span class="p">:</span><span class="ss">:Channel</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="n">sub_id</span>  <span class="o">=</span> <span class="n">channel</span><span class="o">.</span><span class="n">subscribe</span> <span class="p">{</span> <span class="o">|</span><span class="n">msg</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;Got: </span><span class="si">#{</span><span class="n">msg</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">channel</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="s1">&#39;hello world&#39;</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; &quot;Got: hello world&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Clean up channel</span>
</span><span class='line'><span class="n">channel</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">(</span><span class="n">sub_id</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Will output the current time every second since it started</span>
</span><span class='line'><span class="no">EM</span><span class="o">.</span><span class="n">add_timer</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">&quot;Executing timer: </span><span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Deferred blocks execute concurrently to the main thread</span>
</span><span class='line'><span class="no">EM</span><span class="o">.</span><span class="n">defer</span> <span class="p">{</span> <span class="nb">sleep</span> <span class="mi">3</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">&quot;It&#39;s been at least 3 seconds!&quot;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Can even use EventMachine modules and code for async I/O</span>
</span><span class='line'><span class="no">EM</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s1">&#39;ls&#39;</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">output</span><span class="p">,</span><span class="n">status</span><span class="o">|</span> <span class="nb">puts</span> <span class="n">output</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Tear-down, make sure that all EM defers finish</span>
</span><span class='line'><span class="k">while</span> <span class="ow">not</span> <span class="no">EM</span><span class="o">.</span><span class="n">defers_finished?</span><span class="p">;</span> <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>There&rsquo;s some obvious advantages to doing this, you can easily bring asynchronous I/O and concurrent processing to any Ruby program, even in normal Rails code. There is a cost, however, and that comes in performance:</p>

<figure class='code'><figcaption><span>bench_results.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Rehearsal -------------------------------------------------------</span>
</span><span class='line'><span class="c1"># normal EventMachine   0.180000   0.000000   0.180000 (  0.185271)</span>
</span><span class='line'><span class="c1"># ---------------------------------------------- total: 0.180000sec</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#                           user     system      total        real</span>
</span><span class='line'><span class="c1"># normal EventMachine   0.170000   0.000000   0.170000 (  0.173966)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Rehearsal ---------------------------------------------------------</span>
</span><span class='line'><span class="c1"># threaded EventMachine   0.450000   0.730000   1.180000 (  0.806186)</span>
</span><span class='line'><span class="c1"># ------------------------------------------------ total: 1.180000sec</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#                             user     system      total        real</span>
</span><span class='line'><span class="c1"># threaded EventMachine   0.740000   1.390000   2.130000 (  1.384526)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using the threaded approach is a large performance penalty, but the trade off is the additional flexibility. Use it wisely.</p>

<p>Benchmark code for normal EventMachine:</p>

<figure class='code'><figcaption><span>eventmachine_bench.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;eventmachine&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;benchmark&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">EM</span><span class="o">.</span><span class="n">run</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">channel</span> <span class="o">=</span> <span class="ss">EM</span><span class="p">:</span><span class="ss">:Channel</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="n">sub_id</span>  <span class="o">=</span> <span class="n">channel</span><span class="o">.</span><span class="n">subscribe</span> <span class="p">{</span> <span class="o">|</span><span class="n">msg</span><span class="o">|</span> <span class="n">counter</span> <span class="o">+=</span> <span class="n">msg</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">Benchmark</span><span class="o">.</span><span class="n">bmbm</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'>    <span class="n">x</span><span class="o">.</span><span class="n">report</span><span class="p">(</span><span class="s2">&quot;normal EventMachine&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="mi">50000</span><span class="o">.</span><span class="n">times</span> <span class="p">{</span><span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">channel</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Benchmark code for the threaded EventMachine:</p>

<figure class='code'><figcaption><span>eventmachine_thread_bench.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;eventmachine&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;benchmark&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">Thread</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="no">EM</span><span class="o">.</span><span class="n">run</span>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Catch signals to ensure a clean shutdown of EventMachine</span>
</span><span class='line'><span class="nb">trap</span><span class="p">(</span><span class="ss">:INT</span><span class="p">)</span> <span class="p">{</span> <span class="no">EM</span><span class="o">.</span><span class="n">stop</span> <span class="p">}</span>
</span><span class='line'><span class="nb">trap</span><span class="p">(</span><span class="ss">:TERM</span><span class="p">){</span> <span class="no">EM</span><span class="o">.</span><span class="n">stop</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Wait for the reactor to start</span>
</span><span class='line'><span class="k">while</span> <span class="ow">not</span> <span class="no">EM</span><span class="o">.</span><span class="n">reactor_running?</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">channel</span> <span class="o">=</span> <span class="ss">EventMachine</span><span class="p">:</span><span class="ss">:Channel</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="n">sub_id</span>  <span class="o">=</span> <span class="n">channel</span><span class="o">.</span><span class="n">subscribe</span> <span class="p">{</span> <span class="o">|</span><span class="n">msg</span><span class="o">|</span> <span class="n">counter</span> <span class="o">+=</span> <span class="n">msg</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="no">Benchmark</span><span class="o">.</span><span class="n">bmbm</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'>  <span class="n">x</span><span class="o">.</span><span class="n">report</span><span class="p">(</span><span class="s2">&quot;threaded EventMachine&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="mi">50000</span><span class="o">.</span><span class="n">times</span> <span class="p">{</span><span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">channel</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Streaming Youtube to MP3 Audio in NodeJS]]></title>
    <link href="http://pauldbergeron.com/articles/streaming-youtube-to-mp3-audio-in-nodejs.html"/>
    <updated>2011-12-28T00:00:00+01:00</updated>
    <id>http://pauldbergeron.com/articles/streaming-youtube-to-mp3-audio-in-nodejs</id>
    <content type="html"><![CDATA[<p>Recently I learned how to stream a Youtube video&rsquo;s audio in MP3 format using
nodejs. I wanted to publish my findings and show off how to accomplish this.</p>

<p>First, let&rsquo;s build this the non streaming way, and then I will show you how to
upgrade to a streaming method. You must install the powerful
<a href="http://ffmpeg.org/">ffmpeg</a> via your package management system of choice in
order to play along.</p>

<p>I&rsquo;ll be using <a href="http://nodejs.org/">nodejs</a>, to do this, because it offers us a
very easy way to stream bits around. Despite the recent controversy, I&rsquo;m still
quite partial to c<a href="http://jashkenas.github.com/coffee-script/">offee-script</a>
due to it&rsquo;s terse syntax and clean output, so I&rsquo;m going to use that for most
of the new code. Let&rsquo;s also use the wonderful
<a href="http://expressjs.com/">expressjs</a> framework to get us started really quickly.
This will set up our project skeleton.</p>

<!-- more -->




<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>express youtube_audio_streamer
</span><span class='line'><span class="nb">cd </span>youtube_audio_streamer <span class="o">&amp;&amp;</span> npm install
</span></code></pre></td></tr></table></div></figure>


<p>You can now convert the skeleton into coffee-script if you like, but I leave
this as an exercise to the reader. For the sake of time I simply spawn another
shell and do the following in it:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>mkdir routes/coffee
</span><span class='line'>cat &gt; routes/coffee/index.coffee <span class="s">&lt;&lt;SCRIPT</span>
</span><span class='line'><span class="s">exports.index = (req, res) -&gt;</span>
</span><span class='line'><span class="s">res.render(&#39;index&#39;, { title: &#39;Express&#39; })</span>
</span><span class='line'><span class="s">SCRIPT</span>
</span><span class='line'>coffee -c -w -o routes routes/coffee/*
</span></code></pre></td></tr></table></div></figure>


<p>Then in yet another shell we can:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>node app.js
</span></code></pre></td></tr></table></div></figure>


<p>And we&rsquo;re rocking the &ldquo;hello world!&rdquo; page.</p>

<p>Now, we have to add another dependancy to the project. It turns out that
getting a good, uncompressed FLV that ffmpeg can digest into something we can
use is a giant pain. There&rsquo;s cookies that need setting, HTML that needs
parsing, and language detection to accomplish. Luckily for us, misery loves
company and the hard work of turning a normal youtube video url ( <a href="http://www.youtube.com/watch?v=:youtube_video_id">http://www.youtube.com/watch?v=:youtube_video_id</a> ) into
a ffmpeg edible FLV can be done by <a href="https://github.com/rg3%0A/youtube-dl/">youtube-dl</a>. Requires python, but otherwise dependancy free. This means that
we can focus on building something quickly. Assuming you&rsquo;ve got a sane python
accessible on your system, install it to the root of the project like so:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>curl -s -o youtube-dl https://raw.github.com/rg3/youtube-dl/2011.12.18/youtube-dl <span class="o">&amp;&amp;</span>
</span><span class='line'>chmod +x youtube-dl
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s use it from the command line and see what how it works. I&rsquo;ve plucked a
random short video clip that&rsquo;s holiday themed for the demonstration. Remember,
we just want the audio, and we want it in MP3.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>./youtube-dl --extract-audio --audio-format mp3
</span><span class='line'>http://www.youtube.com/watch<span class="o">](</span>http://www.youtube.com/watch<span class="o">)</span><span class="se">\?</span>v<span class="se">\=</span>mayCvk2P4f0
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> Setting language
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> mayCvk2P4f0: Downloading video webpage
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> mayCvk2P4f0: Downloading video info webpage
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> mayCvk2P4f0: Extracting video information
</span><span class='line'><span class="o">[</span>download<span class="o">]</span> Destination: mayCvk2P4f0.flv
</span><span class='line'><span class="o">[</span>download<span class="o">]</span> 100.0% of 124.19k at  988.27k/s ETA 00:00
</span><span class='line'><span class="o">[</span>ffmpeg<span class="o">]</span> Destination: mayCvk2P4f0.mp3
</span></code></pre></td></tr></table></div></figure>


<p>Playing the resulting mayCvk2P4f0.mp3 results in Arnald&rsquo;s voice demanding us
to release the cookie. Excellent! Let&rsquo;s make an API for this!</p>

<p>The only variable in all of this is the alphanumeric video id at end of the
youtube video URL. I&rsquo;m going to call this the :youtube_video_id from now on.
Since we&rsquo;ll be using a child process to launch youtube-dl, and we&rsquo;re going to
need to write the resulant file back to the browser, we&rsquo;ll need the native
nodejs modules &lsquo;child_process&rsquo; and &lsquo;fs&rsquo;. Knowing this, let&rsquo;s add the following
code to routes/coffee/index.coffee</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">exports.youtube_mp3 = </span><span class="nf">(req, res) -&gt;</span>
</span><span class='line'>  <span class="c1"># Spawn a child process to obtain FLV and use ffmpeg to convert it.</span>
</span><span class='line'>  <span class="nv">youtube_dl = </span><span class="nx">spawn</span> <span class="s">&#39;./youtube-dl&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s">&#39;--extract-audio&#39;</span><span class="p">,</span> <span class="s">&#39;--audio-format&#39;</span><span class="p">,</span> <span class="s">&#39;mp3&#39;</span><span class="p">,</span> <span class="s">&quot;http://www.youtube.com/watch?v=</span><span class="si">#{</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">youtube_video_id</span><span class="si">}</span><span class="s">&quot;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Let&#39;s echo the output of the child to see what&#39;s going on</span>
</span><span class='line'>  <span class="nx">youtube_dl</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">on</span> <span class="s">&#39;data&#39;</span><span class="p">,</span> <span class="nf">(data) -&gt;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="nx">data</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span>
</span><span class='line'>    <span class="c1"># Incase something bad happens, we should write that out too.</span>
</span><span class='line'>    <span class="nx">youtube_dl</span><span class="p">.</span><span class="nx">stderr</span><span class="p">.</span><span class="nx">on</span> <span class="s">&#39;data&#39;</span><span class="p">,</span> <span class="nf">(data) -&gt;</span>
</span><span class='line'>      <span class="nx">process</span><span class="p">.</span><span class="nx">stderr</span><span class="p">.</span><span class="nx">write</span> <span class="nx">data</span>
</span><span class='line'>      <span class="c1"># when we&#39;re done, let&#39;s send back the output</span>
</span><span class='line'>    <span class="nx">youtube_dl</span><span class="p">.</span><span class="nx">on</span> <span class="s">&#39;exit&#39;</span><span class="p">,</span> <span class="nf">-&gt;</span>
</span><span class='line'>      <span class="nx">readFile</span> <span class="s">&quot;./</span><span class="si">#{</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">youtube_video_id</span><span class="si">}</span><span class="s">.mp3&quot;</span><span class="p">,</span> <span class="nf">(err, data) -&gt;</span>
</span><span class='line'>      <span class="c1"># We set our content type so consumers of our API know what they are getting</span>
</span><span class='line'>      <span class="nx">res</span><span class="p">.</span><span class="nx">send</span> <span class="nx">data</span><span class="p">,</span> <span class="p">{</span> <span class="s">&#39;Content-Type&#39;</span><span class="o">:</span> <span class="s">&#39;audio/mpeg3&#39;</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s add this to our routes in app.js with this line:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;/youtube_mp3/:youtube_video_id&#39;</span><span class="p">,</span> <span class="nx">routes</span><span class="p">.</span><span class="nx">youtube_mp3</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now restart our development server and go to <a href="http://localhost:3000/youtube_mp3/mayCvk2P4f0">http://localhost:3000/youtube_mp3/mayCvk2P4f0</a> to see the
following in the log. It will probably differ slightly, and as you can see,
the internet connection I&rsquo;m on is terribly slow. If you have something in your
browser capable of playing mp3&rsquo;s, you should hear audio.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Express server listening on port 3000 in development mode
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> Setting language
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> mayCvk2P4f0: Downloading video webpage
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> mayCvk2P4f0: Downloading video info webpage
</span><span class='line'><span class="o">[</span>youtube<span class="o">]</span> mayCvk2P4f0: Extracting video information
</span><span class='line'><span class="o">[</span>download<span class="o">]</span> Destination: mayCvk2P4f0.flv
</span><span class='line'><span class="o">[</span>download<span class="o">]</span>  5.6% of 124.19k at  93.16k/s ETA 00:01
</span><span class='line'><span class="o">[</span>download<span class="o">]</span>  12.1% of 124.19k at  195.03k/s ETA 00:00
</span><span class='line'><span class="o">[</span>download<span class="o">]</span>  25.0% of 124.19k at  201.17k/s ETA 00:00
</span><span class='line'><span class="o">[</span>download<span class="o">]</span>  50.7% of 124.19k at  387.09k/s ETA 00:00
</span><span class='line'><span class="o">[</span>download<span class="o">]</span> 100.0% of 124.19k at  530.81k/s ETA 00:00
</span><span class='line'><span class="o">[</span>ffmpeg<span class="o">]</span> Destination: mayCvk2P4f0.mp3
</span></code></pre></td></tr></table></div></figure>


<p>So, what just happened? We take the id of a video, and feed it to youtube-dl,
which finds us an appropriate FLV file. This is then fed into ffmpeg, which
outputs this to a static mp3 file, which we then open and read. We should
probably upgrade this to cleanly delete the mp3 when it&rsquo;s done, but it will be
better to do this as streaming instead, then not only will we have no
intermediary file to worry about, it will be a better user experiance.</p>

<p>To see what I mean about a better user experiance, instead of using a short
video, let&rsquo;s try a long one. I&rsquo;m going to demonstrate this with a 8:44 long
video of New Years 2011 in Times Square, . Go to <a href="http://localhost:3000/youtube_mp3/GKpRXswgDwU">http://localhost:3000/youtube_mp3/GKpRXswgDwU</a>. If you have
a fast internet connection, this video may download fully and play before your
browser times out, but I doubt you&rsquo;ll be impressed with the performance of our
first attempted solution. I won&rsquo;t paste the log here, but you&rsquo;ll see the video
is ~133mb! Way too much data to download all at once and expect reasonable
performance. Now, youtube-dl has some options about setting the max quality
and since it defaults to the highest availible we could probably do well to
turn that down. In fact, if you do end up using this code in production, I
would suggest you do that anyway if only to lower the bandwidth bill.</p>

<p>In order to make this work with larger videos, we can&rsquo;t just download the
whole video up front. We need to be able to simultaneously stream the video
from youtube into ffmpeg, and the output of ffmpeg, directly into the
response.</p>

<p>Let&rsquo;s step away from the code and get something working in the shell first. To
solve the first problem of streaming the FLV into ffmpeg, we can get ffmpeg to
take input from stdin, and use a unix pipe to stream in the data outputed from
GET&#8217;ing the URL of the FLV. We&rsquo;re going to need to get the URL that&rsquo;s used
internally by youtube-dl. Luck us, there&rsquo;s a combination of options that
outputs this for us in <code>./youtube-dl --help</code>. Here&rsquo;s the incantation to get
the FLV from a youtube video URL without downloading any video:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>./youtube-dl --simulate --get-url http://www.youtube.com/watch<span class="se">\?</span>v<span class="se">\=</span>:youtube_video_id
</span></code></pre></td></tr></table></div></figure>


<p>Now with the URL, we can write the new streaming code by first retriveing that
URL by using a youtube-dl child process. Then we can GET the FLV, as we
recieve the file from youtube, we can pipe the data directly into a ffmpeg
subprocess. With ffmpeg set to output the data on stdout, we can pipe this
data directly to the response.</p>

<p>The two subprocess streaming to response setup can be done using pure nodejs,
but why do that when we have the excellent
<a href="https://github.com/mikeal/request">request</a> library at our disposal. As you
will see, this library makes the code a lot shorter and easier to read. Add
this as a dependancy to the project in the package.json file, and then <code>npm
install</code> it.Once that&rsquo;s done, let&rsquo;s replace the whole file of
routes/coffee/index.coffee with this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="p">{</span><span class="nx">spawn</span><span class="p">,</span> <span class="nx">exec</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s">&#39;child_process&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">request = </span><span class="nx">require</span> <span class="s">&#39;request&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">exports.index = </span><span class="nf">(req, res) -&gt;</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s">&#39;index&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nv">title: </span><span class="s">&#39;Express&#39;</span> <span class="p">})</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">exports.youtube_mp3 = </span><span class="nf">(req, res) -&gt;</span>
</span><span class='line'>  <span class="c1"># Spawn a child process to obtain the URL to the FLV</span>
</span><span class='line'>  <span class="nv">youtube_dl_url_child = </span><span class="nx">exec</span> <span class="s">&quot;./youtube-dl --simulate --get-url http://www.youtube.com/watch?v=</span><span class="si">#{</span><span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">youtube_video_id</span><span class="si">}</span><span class="s">&quot;</span><span class="p">,</span> <span class="nf">(err, stdout, stderr) -&gt;</span>
</span><span class='line'>    <span class="c1"># Converting the buffer to a string is a little costly so let&#39;s do it upfront</span>
</span><span class='line'>    <span class="nv">youtube_dl_url = </span><span class="nx">stdout</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span>
</span><span class='line'>    <span class="c1"># there&#39;s a trailing &#39;\n&#39; returned from youtube-dl, let&#39;s cut it off</span>
</span><span class='line'>    <span class="nv">youtube_dl_url = </span><span class="nx">youtube_dl_url</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">youtube_dl_url</span><span class="p">.</span><span class="nx">length</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="c1"># Before we write the output, ensure that we&#39;re sending it back with the proper content type</span>
</span><span class='line'>    <span class="nv">res.contentType = </span><span class="s">&#39;audio/mpeg3&#39;</span>
</span><span class='line'>    <span class="c1"># Create an ffmpeg process to feed the video to.</span>
</span><span class='line'>    <span class="nv">ffmpeg_child = </span><span class="nx">spawn</span> <span class="s">&quot;ffmpeg&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s">&#39;-i&#39;</span><span class="p">,</span> <span class="s">&#39;pipe:0&#39;</span><span class="p">,</span> <span class="s">&#39;-acodec&#39;</span><span class="p">,</span> <span class="s">&#39;libmp3lame&#39;</span><span class="p">,</span><span class="s">&#39;-f&#39;</span><span class="p">,</span> <span class="s">&#39;mp3&#39;</span><span class="p">,</span> <span class="s">&#39;-&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="c1"># Setting up the output pipe before we set up the input pipe ensures wedon&#39;t loose any data.</span>
</span><span class='line'>    <span class="nx">ffmpeg_child</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">res</span><span class="p">)</span>
</span><span class='line'>    <span class="c1"># GET the FLV, pipe the response&#39;s body to our ffmpeg process.</span>
</span><span class='line'>    <span class="nx">request</span><span class="p">({</span><span class="nv">url: </span><span class="nx">youtube_dl_url</span><span class="p">,</span> <span class="nv">headers: </span><span class="p">{</span><span class="s">&#39;Youtubedl-no-compression&#39;</span><span class="o">:</span><span class="s">&#39;True&#39;</span><span class="p">}}).</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">ffmpeg_child</span><span class="p">.</span><span class="nx">stdin</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are a couple of bits of &ldquo;magic&rdquo; that need to be covered in the above
code. Digging around in the source of youtube-dl, you&rsquo;ll see the request to
get the FLV has the header &lsquo;Youtubedl-no-compression&rsquo; set to &lsquo;True&rsquo;. I mimic
this behavior in order to ensure ffmpeg get&rsquo;s uncompressed FLV data from
youtube, as ffmpeg does not support compressed FLVs. A possible upgrade later
is to dechipher the FLV compression and decompress this on the fly to ffmpeg,
so we can use less bandwidth downloading the video. The other bit of magic are
the command line args we&rsquo;re passing to ffmpeg. They are a combination of the
same args used by youtube-dl to produce an mp3, as well as telling ffmpeg to
take data in from stdin (the &lsquo;-i&rsquo;, and &lsquo;pipe:0&rsquo;) and output to stdout (the
&lsquo;&ndash;&rsquo;) We&rsquo;re also using LAME to re-encode the audio to mp3, you may need to
adjust this to an encoder availible on your system, or install LAME if it
isn&rsquo;t installed.</p>

<p>A few other comments, I dropped the dependency on &lsquo;fs&rsquo; as we aren&rsquo;t reading a
file anymore, and I use &lsquo;child_process.exec&rsquo; for getting the URL, as the
output is short and we fully depend on the completion of this process before
moving on. I use &lsquo;child_process.spawn&rsquo; for creating the ffmpeg child process
because it allows access to the stdin and stdout streams. There&rsquo;s also lots of
things that can go wrong that I&rsquo;m not checking for, but this is a proof of
concept code sample anyway, so use at your own risk.</p>

<p>After restarting your development server, go to <a href="http://localhost:3000/youtube_mp3/GKpRXswgDwU">http://localhost:3000/youtube_mp3/GKpRXswgDwU</a>. What once
either timed out or sat for a long time no longer does! Provided everything
went OK, we get the expected behavior of streaming the audio through the whole
process.</p>

<p>A note about scaling: this setup would be expensive to scale due to the re-
encoding which is CPU bound, and with the code above you&rsquo;re limited to a
single machine. To scale this further, I would
use<a href="http://www.zeromq.org/">ZeroMQ</a>. On each request for a youtube video to be
encoded as audio, use a ZMQ_PUSH socket to give a FLV URL worker a
:youtube_video_id to lookup to a FLV URL. This worker could then ZMQ_PUSH to
another set of workers that download the FLV and re-encode the audio to mp3,
while publishing with ZMQ_PUB a response_id and a chunk of data to write to
it. This setup will scale horizontally very well, additional horsepower can be
added very easily to the re-encoding layer. Alternate scaling plans could be
to use Ha-Proxy to round-robin the full HTTP requests to different machines
running the code here, but this would need to be separate from the rest of the
web application&rsquo;s code.</p>

<p>I hope that the exercise was as educational for you as it was for me. Some
other things to think about, how do we enchance this to accept &ldquo;Range&rdquo;
requests so we can use the streamed audio with <a href="http://jplayer.org/">jPlayer</a>?
We&rsquo;ll need to have better error handling to use this in production, where are
some good places to add error handling and what&rsquo;s worthwhile to validate? Is
there anyway we can decompress the FLVs on the fly and then stream this output
to ffmpeg, to save bandwidth? What&rsquo;s a good caching strategy for looking up
the URLs of the FLVs from youtube? Is it worthwhile to move the URL retrieval
process into JS so we can do this in nodejs?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fixed Point Math in C#]]></title>
    <link href="http://pauldbergeron.com/articles/fixed-point-math-in-c.html"/>
    <updated>2009-07-01T00:00:00+02:00</updated>
    <id>http://pauldbergeron.com/articles/fixed-point-math-in-c</id>
    <content type="html"><![CDATA[<p>Fixed point math is an interesting optimization for games, and it also has the
feature of determinism, something that floating point implementations lack due
to rounding, truncation, and hardware differences.</p>

<p>With determinism, a networked physics simulation can guarantee that every
machine can perform the same action, and given the exact same starting
conditions, produce the same result. This reduces the network overhead
significantly, instead of being forced to check the same result was achieved
across all computers participating, one can instead make sure that each action
was completed in the correct order instead.</p>

<!-- more -->


<p>Of course, cheating may force checks on the results anyway, but that&rsquo;s a
different problem.</p>

<figure class='code'><figcaption><span> (FInt.cs)</span> <a href='http://pauldbergeron.com/downloads/code/FInt.cs'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
<span class='line-number'>182</span>
<span class='line-number'>183</span>
<span class='line-number'>184</span>
<span class='line-number'>185</span>
<span class='line-number'>186</span>
<span class='line-number'>187</span>
<span class='line-number'>188</span>
<span class='line-number'>189</span>
<span class='line-number'>190</span>
<span class='line-number'>191</span>
<span class='line-number'>192</span>
<span class='line-number'>193</span>
<span class='line-number'>194</span>
<span class='line-number'>195</span>
<span class='line-number'>196</span>
<span class='line-number'>197</span>
<span class='line-number'>198</span>
<span class='line-number'>199</span>
<span class='line-number'>200</span>
<span class='line-number'>201</span>
<span class='line-number'>202</span>
<span class='line-number'>203</span>
<span class='line-number'>204</span>
<span class='line-number'>205</span>
<span class='line-number'>206</span>
<span class='line-number'>207</span>
<span class='line-number'>208</span>
<span class='line-number'>209</span>
<span class='line-number'>210</span>
<span class='line-number'>211</span>
<span class='line-number'>212</span>
<span class='line-number'>213</span>
<span class='line-number'>214</span>
<span class='line-number'>215</span>
<span class='line-number'>216</span>
<span class='line-number'>217</span>
<span class='line-number'>218</span>
<span class='line-number'>219</span>
<span class='line-number'>220</span>
<span class='line-number'>221</span>
<span class='line-number'>222</span>
<span class='line-number'>223</span>
<span class='line-number'>224</span>
<span class='line-number'>225</span>
<span class='line-number'>226</span>
<span class='line-number'>227</span>
<span class='line-number'>228</span>
<span class='line-number'>229</span>
<span class='line-number'>230</span>
<span class='line-number'>231</span>
<span class='line-number'>232</span>
<span class='line-number'>233</span>
<span class='line-number'>234</span>
<span class='line-number'>235</span>
<span class='line-number'>236</span>
<span class='line-number'>237</span>
<span class='line-number'>238</span>
<span class='line-number'>239</span>
<span class='line-number'>240</span>
<span class='line-number'>241</span>
<span class='line-number'>242</span>
<span class='line-number'>243</span>
<span class='line-number'>244</span>
<span class='line-number'>245</span>
<span class='line-number'>246</span>
<span class='line-number'>247</span>
<span class='line-number'>248</span>
<span class='line-number'>249</span>
<span class='line-number'>250</span>
<span class='line-number'>251</span>
<span class='line-number'>252</span>
<span class='line-number'>253</span>
<span class='line-number'>254</span>
<span class='line-number'>255</span>
<span class='line-number'>256</span>
<span class='line-number'>257</span>
<span class='line-number'>258</span>
<span class='line-number'>259</span>
<span class='line-number'>260</span>
<span class='line-number'>261</span>
<span class='line-number'>262</span>
<span class='line-number'>263</span>
<span class='line-number'>264</span>
<span class='line-number'>265</span>
<span class='line-number'>266</span>
<span class='line-number'>267</span>
<span class='line-number'>268</span>
<span class='line-number'>269</span>
<span class='line-number'>270</span>
<span class='line-number'>271</span>
<span class='line-number'>272</span>
<span class='line-number'>273</span>
<span class='line-number'>274</span>
<span class='line-number'>275</span>
<span class='line-number'>276</span>
<span class='line-number'>277</span>
<span class='line-number'>278</span>
<span class='line-number'>279</span>
<span class='line-number'>280</span>
<span class='line-number'>281</span>
<span class='line-number'>282</span>
<span class='line-number'>283</span>
<span class='line-number'>284</span>
<span class='line-number'>285</span>
<span class='line-number'>286</span>
<span class='line-number'>287</span>
<span class='line-number'>288</span>
<span class='line-number'>289</span>
<span class='line-number'>290</span>
<span class='line-number'>291</span>
<span class='line-number'>292</span>
<span class='line-number'>293</span>
<span class='line-number'>294</span>
<span class='line-number'>295</span>
<span class='line-number'>296</span>
<span class='line-number'>297</span>
<span class='line-number'>298</span>
<span class='line-number'>299</span>
<span class='line-number'>300</span>
<span class='line-number'>301</span>
<span class='line-number'>302</span>
<span class='line-number'>303</span>
<span class='line-number'>304</span>
<span class='line-number'>305</span>
<span class='line-number'>306</span>
<span class='line-number'>307</span>
<span class='line-number'>308</span>
<span class='line-number'>309</span>
<span class='line-number'>310</span>
<span class='line-number'>311</span>
<span class='line-number'>312</span>
<span class='line-number'>313</span>
<span class='line-number'>314</span>
<span class='line-number'>315</span>
<span class='line-number'>316</span>
<span class='line-number'>317</span>
<span class='line-number'>318</span>
<span class='line-number'>319</span>
<span class='line-number'>320</span>
<span class='line-number'>321</span>
<span class='line-number'>322</span>
<span class='line-number'>323</span>
<span class='line-number'>324</span>
<span class='line-number'>325</span>
<span class='line-number'>326</span>
<span class='line-number'>327</span>
<span class='line-number'>328</span>
<span class='line-number'>329</span>
<span class='line-number'>330</span>
<span class='line-number'>331</span>
<span class='line-number'>332</span>
<span class='line-number'>333</span>
<span class='line-number'>334</span>
<span class='line-number'>335</span>
<span class='line-number'>336</span>
<span class='line-number'>337</span>
<span class='line-number'>338</span>
<span class='line-number'>339</span>
<span class='line-number'>340</span>
<span class='line-number'>341</span>
<span class='line-number'>342</span>
<span class='line-number'>343</span>
<span class='line-number'>344</span>
<span class='line-number'>345</span>
<span class='line-number'>346</span>
<span class='line-number'>347</span>
<span class='line-number'>348</span>
<span class='line-number'>349</span>
<span class='line-number'>350</span>
<span class='line-number'>351</span>
<span class='line-number'>352</span>
<span class='line-number'>353</span>
<span class='line-number'>354</span>
<span class='line-number'>355</span>
<span class='line-number'>356</span>
<span class='line-number'>357</span>
<span class='line-number'>358</span>
<span class='line-number'>359</span>
<span class='line-number'>360</span>
<span class='line-number'>361</span>
<span class='line-number'>362</span>
<span class='line-number'>363</span>
<span class='line-number'>364</span>
<span class='line-number'>365</span>
<span class='line-number'>366</span>
<span class='line-number'>367</span>
<span class='line-number'>368</span>
<span class='line-number'>369</span>
<span class='line-number'>370</span>
<span class='line-number'>371</span>
<span class='line-number'>372</span>
<span class='line-number'>373</span>
<span class='line-number'>374</span>
<span class='line-number'>375</span>
<span class='line-number'>376</span>
<span class='line-number'>377</span>
<span class='line-number'>378</span>
<span class='line-number'>379</span>
<span class='line-number'>380</span>
<span class='line-number'>381</span>
<span class='line-number'>382</span>
<span class='line-number'>383</span>
<span class='line-number'>384</span>
<span class='line-number'>385</span>
<span class='line-number'>386</span>
<span class='line-number'>387</span>
<span class='line-number'>388</span>
<span class='line-number'>389</span>
<span class='line-number'>390</span>
<span class='line-number'>391</span>
<span class='line-number'>392</span>
<span class='line-number'>393</span>
<span class='line-number'>394</span>
<span class='line-number'>395</span>
<span class='line-number'>396</span>
<span class='line-number'>397</span>
<span class='line-number'>398</span>
<span class='line-number'>399</span>
<span class='line-number'>400</span>
<span class='line-number'>401</span>
<span class='line-number'>402</span>
<span class='line-number'>403</span>
<span class='line-number'>404</span>
<span class='line-number'>405</span>
<span class='line-number'>406</span>
<span class='line-number'>407</span>
<span class='line-number'>408</span>
<span class='line-number'>409</span>
<span class='line-number'>410</span>
<span class='line-number'>411</span>
<span class='line-number'>412</span>
<span class='line-number'>413</span>
<span class='line-number'>414</span>
<span class='line-number'>415</span>
<span class='line-number'>416</span>
<span class='line-number'>417</span>
<span class='line-number'>418</span>
<span class='line-number'>419</span>
<span class='line-number'>420</span>
<span class='line-number'>421</span>
<span class='line-number'>422</span>
<span class='line-number'>423</span>
<span class='line-number'>424</span>
<span class='line-number'>425</span>
<span class='line-number'>426</span>
<span class='line-number'>427</span>
<span class='line-number'>428</span>
<span class='line-number'>429</span>
<span class='line-number'>430</span>
<span class='line-number'>431</span>
<span class='line-number'>432</span>
<span class='line-number'>433</span>
<span class='line-number'>434</span>
<span class='line-number'>435</span>
<span class='line-number'>436</span>
<span class='line-number'>437</span>
<span class='line-number'>438</span>
<span class='line-number'>439</span>
<span class='line-number'>440</span>
<span class='line-number'>441</span>
<span class='line-number'>442</span>
<span class='line-number'>443</span>
<span class='line-number'>444</span>
<span class='line-number'>445</span>
<span class='line-number'>446</span>
<span class='line-number'>447</span>
<span class='line-number'>448</span>
<span class='line-number'>449</span>
<span class='line-number'>450</span>
<span class='line-number'>451</span>
<span class='line-number'>452</span>
<span class='line-number'>453</span>
<span class='line-number'>454</span>
<span class='line-number'>455</span>
<span class='line-number'>456</span>
<span class='line-number'>457</span>
<span class='line-number'>458</span>
<span class='line-number'>459</span>
<span class='line-number'>460</span>
<span class='line-number'>461</span>
<span class='line-number'>462</span>
<span class='line-number'>463</span>
<span class='line-number'>464</span>
<span class='line-number'>465</span>
<span class='line-number'>466</span>
<span class='line-number'>467</span>
<span class='line-number'>468</span>
<span class='line-number'>469</span>
<span class='line-number'>470</span>
<span class='line-number'>471</span>
<span class='line-number'>472</span>
<span class='line-number'>473</span>
<span class='line-number'>474</span>
<span class='line-number'>475</span>
<span class='line-number'>476</span>
<span class='line-number'>477</span>
<span class='line-number'>478</span>
<span class='line-number'>479</span>
<span class='line-number'>480</span>
<span class='line-number'>481</span>
<span class='line-number'>482</span>
<span class='line-number'>483</span>
<span class='line-number'>484</span>
<span class='line-number'>485</span>
<span class='line-number'>486</span>
<span class='line-number'>487</span>
<span class='line-number'>488</span>
<span class='line-number'>489</span>
<span class='line-number'>490</span>
<span class='line-number'>491</span>
<span class='line-number'>492</span>
<span class='line-number'>493</span>
<span class='line-number'>494</span>
<span class='line-number'>495</span>
<span class='line-number'>496</span>
<span class='line-number'>497</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">Fixed Point Arithmatic structure and relevant methods. Simple fixed point structure included as well.</span>
</span><span class='line'>
</span><span class='line'><span class="cm">Created from information and code gathered here: http://stackoverflow.com/questions/605124/fixed-point-math-in-c</span>
</span><span class='line'>
</span><span class='line'><span class="cm">May be used for anything without permission.</span>
</span><span class='line'>
</span><span class='line'><span class="cm">To quote the original author (x4000 of stackoverflow.com):</span>
</span><span class='line'><span class="cm">&quot;The accuracy of these functions as they are coded here is more than enough for my purposes, but if you need more you can increase the SHIFT AMOUNT on FInt.</span>
</span><span class='line'><span class="cm">Just be aware that if you do so, the constants on [trigonomic] functions will then need to be divided by 4096 and then multiplied by whatever your new SHIFT AMOUNT requires.</span>
</span><span class='line'><span class="cm">You&#39;re likely to run into some bugs if you do that and aren&#39;t careful, so be sure to run checks against the built-in Math functions to make sure that your results aren&#39;t</span>
</span><span class='line'><span class="cm">being put off by incorrectly adjusting a constant.&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">Code credit: x4000 of stackoverflow.com</span>
</span><span class='line'>
</span><span class='line'><span class="cm">Compiled into a usable source file by: Paul Bergeron</span>
</span><span class='line'>
</span><span class='line'><span class="cm">Date: 7/1/2009</span>
</span><span class='line'>
</span><span class='line'><span class="cm">More fixed point functions can be found written in Java here: http://home.comcast.net/~ohommes/MathFP/</span>
</span><span class='line'>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">struct</span> <span class="nc">FInt</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">long</span> <span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">SHIFT_AMOUNT</span> <span class="p">=</span> <span class="m">12</span><span class="p">;</span> <span class="c1">//12 is 4096</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">const</span> <span class="kt">long</span> <span class="n">One</span> <span class="p">=</span> <span class="m">1</span> <span class="p">&lt;&lt;</span> <span class="n">SHIFT_AMOUNT</span><span class="p">;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">OneI</span> <span class="p">=</span> <span class="m">1</span> <span class="p">&lt;&lt;</span> <span class="n">SHIFT_AMOUNT</span><span class="p">;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="n">OneF</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">1</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region Constructors</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">FInt</span><span class="p">(</span> <span class="kt">long</span> <span class="n">StartingRawValue</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">UseMultiple</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">=</span> <span class="n">StartingRawValue</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">UseMultiple</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">=</span> <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;&lt;</span> <span class="n">SHIFT_AMOUNT</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">FInt</span><span class="p">(</span> <span class="kt">double</span> <span class="n">DoubleValue</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">DoubleValue</span> <span class="p">*=</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">One</span><span class="p">;</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">Math</span><span class="p">.</span><span class="n">Round</span><span class="p">(</span> <span class="n">DoubleValue</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">int</span> <span class="n">IntValue</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="kt">int</span><span class="p">)(</span> <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;&gt;</span> <span class="n">SHIFT_AMOUNT</span> <span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">int</span> <span class="nf">ToInt</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="kt">int</span><span class="p">)(</span> <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;&gt;</span> <span class="n">SHIFT_AMOUNT</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">double</span> <span class="nf">ToDouble</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="k">this</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">/</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">One</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">FInt</span> <span class="n">Inverse</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="p">-</span><span class="k">this</span><span class="p">.</span><span class="n">RawValue</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region FromParts</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a fixed-int number from parts.  For example, to create 1.5 pass in 1 and 500.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;PreDecimal&quot;&gt;The number above the decimal.  For 1.5, this would be 1.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;PostDecimal&quot;&gt;The number below the decimal, to three digits.</span>
</span><span class='line'>    <span class="c1">/// For 1.5, this would be 500. For 1.005, this would be 5.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;returns&gt;A fixed-int representation of the number parts&lt;/returns&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">FromParts</span><span class="p">(</span> <span class="kt">int</span> <span class="n">PreDecimal</span><span class="p">,</span> <span class="kt">int</span> <span class="n">PostDecimal</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">f</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="n">PreDecimal</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">PostDecimal</span> <span class="p">!=</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">f</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">+=</span> <span class="p">(</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="n">PostDecimal</span> <span class="p">)</span> <span class="p">/</span> <span class="m">1000</span> <span class="p">).</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">f</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region *</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">*(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">*</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">)</span> <span class="p">&gt;&gt;</span> <span class="n">SHIFT_AMOUNT</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">*(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">multi</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">*</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">multi</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">*(</span> <span class="kt">int</span> <span class="n">multi</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">*</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">multi</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region /</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">/(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;&lt;</span> <span class="n">SHIFT_AMOUNT</span> <span class="p">)</span> <span class="p">/</span> <span class="p">(</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span>  <span class="p">),</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">/(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">divisor</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">/</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">divisor</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">/(</span> <span class="kt">int</span> <span class="n">divisor</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">divisor</span> <span class="p">/</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region %</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">%(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">)</span> <span class="p">%</span> <span class="p">(</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">),</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">%(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">divisor</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">%</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">divisor</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">%(</span> <span class="kt">int</span> <span class="n">divisor</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">divisor</span> <span class="p">%</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region +</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">+(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">+</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">+(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">+</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">+(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">+</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region -</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">-(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">-</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">-(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">-</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">-(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">-</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region ==</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">==(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">==</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">==(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">==</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">==(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">==</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region !=</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">!=(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">!=</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">!=(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">!=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">!=(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">!=</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region &gt;=</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;=(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;=</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;=(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">&gt;=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;=(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">&gt;=</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region &lt;=</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;=(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;=</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;=(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">&lt;=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;=(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">&lt;=</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region &gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">&gt;</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">&gt;</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region &lt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;</span> <span class="n">other</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">other</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">one</span> <span class="p">&lt;</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;(</span> <span class="kt">int</span> <span class="n">other</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">one</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">other</span> <span class="p">&lt;</span> <span class="n">one</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="k">explicit</span> <span class="k">operator</span> <span class="nf">int</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">src</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="kt">int</span><span class="p">)(</span> <span class="n">src</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;&gt;</span> <span class="n">SHIFT_AMOUNT</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="k">explicit</span> <span class="k">operator</span> <span class="nf">FInt</span><span class="p">(</span> <span class="kt">int</span> <span class="n">src</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">src</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="k">explicit</span> <span class="k">operator</span> <span class="nf">FInt</span><span class="p">(</span> <span class="kt">long</span> <span class="n">src</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">src</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="k">explicit</span> <span class="k">operator</span> <span class="nf">FInt</span><span class="p">(</span> <span class="kt">ulong</span> <span class="n">src</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="p">(</span><span class="kt">long</span><span class="p">)</span><span class="n">src</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">&lt;&lt;(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">Amount</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;&lt;</span> <span class="n">Amount</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="k">operator</span> <span class="p">&gt;&gt;(</span> <span class="n">FInt</span> <span class="n">one</span><span class="p">,</span> <span class="kt">int</span> <span class="n">Amount</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">one</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;&gt;</span> <span class="n">Amount</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">override</span> <span class="kt">bool</span> <span class="nf">Equals</span><span class="p">(</span> <span class="kt">object</span> <span class="n">obj</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">obj</span> <span class="k">is</span> <span class="n">FInt</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">obj</span> <span class="p">).</span><span class="n">RawValue</span> <span class="p">==</span> <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span><span class="p">;</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">override</span> <span class="kt">int</span> <span class="nf">GetHashCode</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">RawValue</span><span class="p">.</span><span class="n">GetHashCode</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">ToString</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">RawValue</span><span class="p">.</span><span class="n">ToString</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region PI, DoublePI</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="n">PI</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">12868</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span> <span class="c1">//PI x 2^12</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="n">TwoPIF</span> <span class="p">=</span> <span class="n">PI</span> <span class="p">*</span> <span class="m">2</span><span class="p">;</span> <span class="c1">//radian equivalent of 260 degrees</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="n">PIOver180F</span> <span class="p">=</span> <span class="n">PI</span> <span class="p">/</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="m">180</span><span class="p">;</span> <span class="c1">//PI / 180</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region Sqrt</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Sqrt</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">f</span><span class="p">,</span> <span class="kt">int</span> <span class="n">NumberOfIterations</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">f</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;</span> <span class="m">0</span> <span class="p">)</span> <span class="c1">//NaN in Math.Sqrt</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArithmeticException</span><span class="p">(</span> <span class="s">&quot;Input Error&quot;</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">f</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">==</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="m">0</span><span class="p">;</span>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">k</span> <span class="p">=</span> <span class="n">f</span> <span class="p">+</span> <span class="n">FInt</span><span class="p">.</span><span class="n">OneF</span> <span class="p">&gt;&gt;</span> <span class="m">1</span><span class="p">;</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span> <span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">NumberOfIterations</span><span class="p">;</span> <span class="n">i</span><span class="p">++</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">k</span> <span class="p">=</span> <span class="p">(</span> <span class="n">k</span> <span class="p">+</span> <span class="p">(</span> <span class="n">f</span> <span class="p">/</span> <span class="n">k</span> <span class="p">)</span> <span class="p">)</span> <span class="p">&gt;&gt;</span> <span class="m">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">k</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&lt;</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArithmeticException</span><span class="p">(</span> <span class="s">&quot;Overflow&quot;</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">k</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Sqrt</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">f</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">byte</span> <span class="n">numberOfIterations</span> <span class="p">=</span> <span class="m">8</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">f</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;</span> <span class="m">0</span><span class="n">x64000</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">numberOfIterations</span> <span class="p">=</span> <span class="m">12</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">f</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">&gt;</span> <span class="m">0</span><span class="n">x3e8000</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">numberOfIterations</span> <span class="p">=</span> <span class="m">16</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">Sqrt</span><span class="p">(</span> <span class="n">f</span><span class="p">,</span> <span class="n">numberOfIterations</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region Sin</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Sin</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">i</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">j</span> <span class="p">=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="m">0</span><span class="p">;</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span> <span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">+=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">25736</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span> <span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="p">&gt;</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">25736</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">i</span> <span class="p">%=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">25736</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">k</span> <span class="p">=</span> <span class="p">(</span> <span class="n">i</span> <span class="p">*</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">10</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span> <span class="p">/</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">714</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="p">!=</span> <span class="m">0</span> <span class="p">&amp;&amp;</span> <span class="n">i</span> <span class="p">!=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">6434</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">&amp;&amp;</span> <span class="n">i</span> <span class="p">!=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">12868</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>            <span class="n">i</span> <span class="p">!=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">19302</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">&amp;&amp;</span> <span class="n">i</span> <span class="p">!=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">25736</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">j</span> <span class="p">=</span> <span class="p">(</span> <span class="n">i</span> <span class="p">*</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">100</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span> <span class="p">/</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">714</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">-</span> <span class="n">k</span> <span class="p">*</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">10</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">k</span> <span class="p">&lt;=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">90</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">sin_lookup</span><span class="p">(</span> <span class="n">k</span><span class="p">,</span> <span class="n">j</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">k</span> <span class="p">&lt;=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">180</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">sin_lookup</span><span class="p">(</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">180</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">-</span> <span class="n">k</span><span class="p">,</span> <span class="n">j</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">k</span> <span class="p">&lt;=</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">270</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">sin_lookup</span><span class="p">(</span> <span class="n">k</span> <span class="p">-</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">180</span><span class="p">,</span> <span class="k">false</span> <span class="p">),</span> <span class="n">j</span> <span class="p">).</span><span class="n">Inverse</span><span class="p">;</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">sin_lookup</span><span class="p">(</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">360</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">-</span> <span class="n">k</span><span class="p">,</span> <span class="n">j</span> <span class="p">).</span><span class="n">Inverse</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">private</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">sin_lookup</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">i</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">j</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">j</span> <span class="p">&gt;</span> <span class="m">0</span> <span class="p">&amp;&amp;</span> <span class="n">j</span> <span class="p">&lt;</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">10</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">&amp;&amp;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">90</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">SIN_TABLE</span><span class="p">[</span><span class="n">i</span><span class="p">.</span><span class="n">RawValue</span><span class="p">],</span> <span class="k">false</span> <span class="p">)</span> <span class="p">+</span>
</span><span class='line'>                <span class="p">(</span> <span class="p">(</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="n">SIN_TABLE</span><span class="p">[</span><span class="n">i</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">+</span> <span class="m">1</span><span class="p">],</span> <span class="k">false</span> <span class="p">)</span> <span class="p">-</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="n">SIN_TABLE</span><span class="p">[</span><span class="n">i</span><span class="p">.</span><span class="n">RawValue</span><span class="p">],</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span> <span class="p">/</span>
</span><span class='line'>                <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="m">10</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">)</span> <span class="p">*</span> <span class="n">j</span><span class="p">;</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="n">SIN_TABLE</span><span class="p">[</span><span class="n">i</span><span class="p">.</span><span class="n">RawValue</span><span class="p">],</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">private</span> <span class="k">static</span> <span class="kt">int</span><span class="p">[]</span> <span class="n">SIN_TABLE</span> <span class="p">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="m">0</span><span class="p">,</span> <span class="m">71</span><span class="p">,</span> <span class="m">142</span><span class="p">,</span> <span class="m">214</span><span class="p">,</span> <span class="m">285</span><span class="p">,</span> <span class="m">357</span><span class="p">,</span> <span class="m">428</span><span class="p">,</span> <span class="m">499</span><span class="p">,</span> <span class="m">570</span><span class="p">,</span> <span class="m">641</span><span class="p">,</span>
</span><span class='line'>        <span class="m">711</span><span class="p">,</span> <span class="m">781</span><span class="p">,</span> <span class="m">851</span><span class="p">,</span> <span class="m">921</span><span class="p">,</span> <span class="m">990</span><span class="p">,</span> <span class="m">1060</span><span class="p">,</span> <span class="m">1128</span><span class="p">,</span> <span class="m">1197</span><span class="p">,</span> <span class="m">1265</span><span class="p">,</span> <span class="m">1333</span><span class="p">,</span>
</span><span class='line'>        <span class="m">1400</span><span class="p">,</span> <span class="m">1468</span><span class="p">,</span> <span class="m">1534</span><span class="p">,</span> <span class="m">1600</span><span class="p">,</span> <span class="m">1665</span><span class="p">,</span> <span class="m">1730</span><span class="p">,</span> <span class="m">1795</span><span class="p">,</span> <span class="m">1859</span><span class="p">,</span> <span class="m">1922</span><span class="p">,</span> <span class="m">1985</span><span class="p">,</span>
</span><span class='line'>        <span class="m">2048</span><span class="p">,</span> <span class="m">2109</span><span class="p">,</span> <span class="m">2170</span><span class="p">,</span> <span class="m">2230</span><span class="p">,</span> <span class="m">2290</span><span class="p">,</span> <span class="m">2349</span><span class="p">,</span> <span class="m">2407</span><span class="p">,</span> <span class="m">2464</span><span class="p">,</span> <span class="m">2521</span><span class="p">,</span> <span class="m">2577</span><span class="p">,</span>
</span><span class='line'>        <span class="m">2632</span><span class="p">,</span> <span class="m">2686</span><span class="p">,</span> <span class="m">2740</span><span class="p">,</span> <span class="m">2793</span><span class="p">,</span> <span class="m">2845</span><span class="p">,</span> <span class="m">2896</span><span class="p">,</span> <span class="m">2946</span><span class="p">,</span> <span class="m">2995</span><span class="p">,</span> <span class="m">3043</span><span class="p">,</span> <span class="m">3091</span><span class="p">,</span>
</span><span class='line'>        <span class="m">3137</span><span class="p">,</span> <span class="m">3183</span><span class="p">,</span> <span class="m">3227</span><span class="p">,</span> <span class="m">3271</span><span class="p">,</span> <span class="m">3313</span><span class="p">,</span> <span class="m">3355</span><span class="p">,</span> <span class="m">3395</span><span class="p">,</span> <span class="m">3434</span><span class="p">,</span> <span class="m">3473</span><span class="p">,</span> <span class="m">3510</span><span class="p">,</span>
</span><span class='line'>        <span class="m">3547</span><span class="p">,</span> <span class="m">3582</span><span class="p">,</span> <span class="m">3616</span><span class="p">,</span> <span class="m">3649</span><span class="p">,</span> <span class="m">3681</span><span class="p">,</span> <span class="m">3712</span><span class="p">,</span> <span class="m">3741</span><span class="p">,</span> <span class="m">3770</span><span class="p">,</span> <span class="m">3797</span><span class="p">,</span> <span class="m">3823</span><span class="p">,</span>
</span><span class='line'>        <span class="m">3849</span><span class="p">,</span> <span class="m">3872</span><span class="p">,</span> <span class="m">3895</span><span class="p">,</span> <span class="m">3917</span><span class="p">,</span> <span class="m">3937</span><span class="p">,</span> <span class="m">3956</span><span class="p">,</span> <span class="m">3974</span><span class="p">,</span> <span class="m">3991</span><span class="p">,</span> <span class="m">4006</span><span class="p">,</span> <span class="m">4020</span><span class="p">,</span>
</span><span class='line'>        <span class="m">4033</span><span class="p">,</span> <span class="m">4045</span><span class="p">,</span> <span class="m">4056</span><span class="p">,</span> <span class="m">4065</span><span class="p">,</span> <span class="m">4073</span><span class="p">,</span> <span class="m">4080</span><span class="p">,</span> <span class="m">4086</span><span class="p">,</span> <span class="m">4090</span><span class="p">,</span> <span class="m">4093</span><span class="p">,</span> <span class="m">4095</span><span class="p">,</span>
</span><span class='line'>        <span class="m">4096</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">private</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">mul</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">F1</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">F2</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">F1</span> <span class="p">*</span> <span class="n">F2</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region Cos, Tan, Asin</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Cos</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">i</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">Sin</span><span class="p">(</span> <span class="n">i</span> <span class="p">+</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">6435</span><span class="p">,</span> <span class="k">false</span> <span class="p">)</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Tan</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">i</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">Sin</span><span class="p">(</span> <span class="n">i</span> <span class="p">)</span> <span class="p">/</span> <span class="n">Cos</span><span class="p">(</span> <span class="n">i</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Asin</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">F</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">bool</span> <span class="n">isNegative</span> <span class="p">=</span> <span class="n">F</span> <span class="p">&lt;</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>        <span class="n">F</span> <span class="p">=</span> <span class="n">Abs</span><span class="p">(</span> <span class="n">F</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">F</span> <span class="p">&gt;</span> <span class="n">FInt</span><span class="p">.</span><span class="n">OneF</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArithmeticException</span><span class="p">(</span> <span class="s">&quot;Bad Asin Input:&quot;</span> <span class="p">+</span> <span class="n">F</span><span class="p">.</span><span class="n">ToDouble</span><span class="p">()</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">f1</span> <span class="p">=</span> <span class="n">mul</span><span class="p">(</span> <span class="n">mul</span><span class="p">(</span> <span class="n">mul</span><span class="p">(</span> <span class="n">mul</span><span class="p">(</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">145103</span> <span class="p">&gt;&gt;</span> <span class="n">FInt</span><span class="p">.</span><span class="n">SHIFT_AMOUNT</span><span class="p">,</span> <span class="k">false</span> <span class="p">),</span> <span class="n">F</span> <span class="p">)</span> <span class="p">-</span>
</span><span class='line'>            <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="m">599880</span> <span class="p">&gt;&gt;</span> <span class="n">FInt</span><span class="p">.</span><span class="n">SHIFT_AMOUNT</span><span class="p">,</span> <span class="k">false</span> <span class="p">),</span> <span class="n">F</span> <span class="p">)</span> <span class="p">+</span>
</span><span class='line'>            <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="m">1420468</span> <span class="p">&gt;&gt;</span> <span class="n">FInt</span><span class="p">.</span><span class="n">SHIFT_AMOUNT</span><span class="p">,</span> <span class="k">false</span> <span class="p">),</span> <span class="n">F</span> <span class="p">)</span> <span class="p">-</span>
</span><span class='line'>            <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="m">3592413</span> <span class="p">&gt;&gt;</span> <span class="n">FInt</span><span class="p">.</span><span class="n">SHIFT_AMOUNT</span><span class="p">,</span> <span class="k">false</span> <span class="p">),</span> <span class="n">F</span> <span class="p">)</span> <span class="p">+</span>
</span><span class='line'>            <span class="k">new</span> <span class="nf">FInt</span><span class="p">(</span> <span class="m">26353447</span> <span class="p">&gt;&gt;</span> <span class="n">FInt</span><span class="p">.</span><span class="n">SHIFT_AMOUNT</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">f2</span> <span class="p">=</span> <span class="n">PI</span> <span class="p">/</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">2</span><span class="p">,</span> <span class="k">true</span> <span class="p">)</span> <span class="p">-</span> <span class="p">(</span> <span class="n">Sqrt</span><span class="p">(</span> <span class="n">FInt</span><span class="p">.</span><span class="n">OneF</span> <span class="p">-</span> <span class="n">F</span> <span class="p">)</span> <span class="p">*</span> <span class="n">f1</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">isNegative</span> <span class="p">?</span> <span class="n">f2</span><span class="p">.</span><span class="n">Inverse</span> <span class="p">:</span> <span class="n">f2</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region ATan, ATan2</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Atan</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">F</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">Asin</span><span class="p">(</span> <span class="n">F</span> <span class="p">/</span> <span class="n">Sqrt</span><span class="p">(</span> <span class="n">FInt</span><span class="p">.</span><span class="n">OneF</span> <span class="p">+</span> <span class="p">(</span> <span class="n">F</span> <span class="p">*</span> <span class="n">F</span> <span class="p">)</span> <span class="p">)</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Atan2</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">F1</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">F2</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">F2</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">==</span> <span class="m">0</span> <span class="p">&amp;&amp;</span> <span class="n">F1</span><span class="p">.</span><span class="n">RawValue</span> <span class="p">==</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="m">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">FInt</span> <span class="n">result</span> <span class="p">=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="m">0</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">F2</span> <span class="p">&gt;</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>            <span class="n">result</span> <span class="p">=</span> <span class="n">Atan</span><span class="p">(</span> <span class="n">F1</span> <span class="p">/</span> <span class="n">F2</span> <span class="p">);</span>
</span><span class='line'>        <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span> <span class="n">F2</span> <span class="p">&lt;</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span> <span class="n">F1</span> <span class="p">&gt;=</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>                <span class="n">result</span> <span class="p">=</span> <span class="p">(</span> <span class="n">PI</span> <span class="p">-</span> <span class="n">Atan</span><span class="p">(</span> <span class="n">Abs</span><span class="p">(</span> <span class="n">F1</span> <span class="p">/</span> <span class="n">F2</span> <span class="p">)</span> <span class="p">)</span> <span class="p">);</span>
</span><span class='line'>            <span class="k">else</span>
</span><span class='line'>                <span class="n">result</span> <span class="p">=</span> <span class="p">(</span> <span class="n">PI</span> <span class="p">-</span> <span class="n">Atan</span><span class="p">(</span> <span class="n">Abs</span><span class="p">(</span> <span class="n">F1</span> <span class="p">/</span> <span class="n">F2</span> <span class="p">)</span> <span class="p">)</span> <span class="p">).</span><span class="n">Inverse</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="n">result</span> <span class="p">=</span> <span class="p">(</span> <span class="n">F1</span> <span class="p">&gt;=</span> <span class="m">0</span> <span class="p">?</span> <span class="n">PI</span> <span class="p">:</span> <span class="n">PI</span><span class="p">.</span><span class="n">Inverse</span> <span class="p">)</span> <span class="p">/</span> <span class="k">new</span> <span class="n">FInt</span><span class="p">(</span> <span class="m">2</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'>    <span class="cp">#region Abs</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FInt</span> <span class="nf">Abs</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">F</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="n">F</span> <span class="p">&lt;</span> <span class="m">0</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">F</span><span class="p">.</span><span class="n">Inverse</span><span class="p">;</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">F</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="cp">#endregion</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">struct</span> <span class="nc">FPoint</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">FInt</span> <span class="n">X</span><span class="p">;</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">FInt</span> <span class="n">Y</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="nf">FPoint</span><span class="p">(</span> <span class="n">FInt</span> <span class="n">X</span><span class="p">,</span> <span class="n">FInt</span> <span class="n">Y</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">X</span> <span class="p">=</span> <span class="n">X</span><span class="p">;</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="n">Y</span> <span class="p">=</span> <span class="n">Y</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FPoint</span> <span class="nf">FromPoint</span><span class="p">(</span> <span class="n">Point</span> <span class="n">p</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">FPoint</span> <span class="n">f</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FPoint</span><span class="p">();</span>
</span><span class='line'>        <span class="n">f</span><span class="p">.</span><span class="n">X</span> <span class="p">=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">p</span><span class="p">.</span><span class="n">X</span><span class="p">;</span>
</span><span class='line'>        <span class="n">f</span><span class="p">.</span><span class="n">Y</span> <span class="p">=</span> <span class="p">(</span><span class="n">FInt</span><span class="p">)</span><span class="n">p</span><span class="p">.</span><span class="n">Y</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">f</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">Point</span> <span class="nf">ToPoint</span><span class="p">(</span> <span class="n">FPoint</span> <span class="n">f</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">Point</span><span class="p">(</span> <span class="n">f</span><span class="p">.</span><span class="n">X</span><span class="p">.</span><span class="n">IntValue</span><span class="p">,</span> <span class="n">f</span><span class="p">.</span><span class="n">Y</span><span class="p">.</span><span class="n">IntValue</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The code is created from information based <a href="http://stackoverflow.com/questions/605124/fixed-point-math-in-c">here</a></p>

<p>More fixed point functions can be found written in Java <a href="http://home.comcast.net/~ohommes/MathFP/">here</a></p>
]]></content>
  </entry>
  
</feed>
