English numeral calculator Challenge

Write a calculator that takes input in a verbal form (as one might speak an equation) and also outputs in a verbal form (as one might speak a number).

Rules

The calculator should be able to:


add, subtract, multiply and divide
handle operands between negative one million and one million
handle outputs between negative one billion and one billion
handle decimal points in its input and place them correctly in its output
handle decimal output to the hundredths place, rounding where needed


All operations yielding fractional results should round to the nearest hundredths place (identically to the output formatting).

Report with output "E" (for error) when input would cause the program to fail due to being incorrectly formatted or dividing by 0; basically, the program shouldn't crash on bad input, because that would be a lousy calculator.

The calculator is allowed, but not required to report errors when operands or output escape their bounds.  This is meant to simplify the problem, but if you disagree with me, feel free to make a calculator capable of correctly handling greater operands and outputs without reporting errors.

Output "E" in the event that an operand for an operation exceeds the bounds defined for operands.

Output "E" in the event that the output exceeds the bounds described for outputs

How the program handles case-sensitivity and whitespace are left up to the golfer, as is the choice of British or American English.1

Programs that bypass the implementation of the calculator by using a language or library that has already implemented the functionality described above will be ineligible for victory.

Winner

The program with the lowest number of characters wins.

Examples

Input: two plus two
Output: four

Input: twenty-one point five minus one point five
Output: twenty

Input: one minus two
Output: negative one

Input: five times five
Output: twenty-five

Input: twenty-five divided by five
Output: five

Input: two plus two minus five times five divided by negative zero point five
Output: ten

Input one million times one thousand
Output: one billion

Input: one million times one thousand plus one
Output: E

Input: two million plus one million
Output: E

Input: one million plus one million plus one million
Output: E
First of all, this is totally cheaty, and not complete to the specs.

requires the --disable-web-security flag on chrome, +22   

Javascript 509 + 22 = 531

x=new XMLHttpRequest;y=Object.keys(x);b=alert;q="querySelectorAll";s="send";x[y[3]]="document";x.open("GET","http://www.wolframalpha.com/input/?i="+escape(prompt()));x[y[10]]=function(c){4===x.readyState&amp;&amp;(w=[].filter.call(x.response[q](".pod h2"),function(a){return"ame:"==a.innerText.slice(-4)})[0].parentElement,(k=w[q]("a")[0])&amp;&amp;"Words only"==k.innerText?(x.open("GET",k.href),x.send()):alert(JSON.parse([].pop.call(x[y[2]][q]("script")).innerHTML.match(/d_0.00\.push\((.+?)\)/)[1]).stringified))};x[s]()


The first off the spec is as well the example output
The input two plus two minus five times five divided by negative zero point five outputs



Any other case should get handled fine (now), this is yet pretty ungolfed as is, I just wanted it to get fixed.


input: two plus two
output: four

input: twenty-one point five minus one point five
output: twenty

input: one minus two
output: negative one

input: five times five
output: twenty-five

input: twenty-five divided by five
output: five

input: two plus two minus five times five divided by negative zero point five
output: fifty-four

input: one million times one thousand
output: one billion

input: one million times one thousand plus one
output: one billion, one

input: two million plus one million:
output: three million

input: one million plus one million plus one million
output: three million




Oh, and if you actually going to test it, it may take a few seconds, as it loads the complete Wolfram Alpha page up to two times.  

Well, there might be a lot to enhance though.