← Back to context

Comment by BobbyTables2

13 hours ago

How does one actually add with this?

It's basically using the "-" embedded in the definition of the eml operator.

Table 4 shows the "size" of the operators when fully expanded to "eml" applications, which is quite large for +, -, ×, and /.

Here's one approach which agrees with the minimum sizes they present:

        eml(x, y             ) = exp(x) − ln(y) # 1 + x + y
        eml(x, 1             ) = exp(x)         # 2 + x
        eml(1, y             ) = e - ln(y)      # 2 + y
        eml(1, exp(e - ln(y))) = ln(y)          # 6 + y; construction from eq (5)
                         ln(1) = 0              # 7

After you have ln and exp, you can invert their applications in the eml function

              eml(ln x, exp y) = x - y          # 9 + x + y

Using a subtraction-of-subtraction to get addition leads to the cost of "27" in Table 4; I'm not sure what formula leads to 19 but I'm guessing it avoids the expensive construction of 0 by using something simpler that cancels:

                   x - (0 - y) = x + y          # 25 + {x} + {y}

Well, once you've derived unary exp and ln you can get subtraction, which then gets you unary negation and you have addition.

  • And then by using the fact that the exponential turns addition into multiplication, you get multiplication (and subtraction gives division).

Don't know adding, but multiplication has diagram on the last page of the PDF.

xy = eml(eml(1, eml(eml(eml(eml(1, eml(eml(1, eml(1, x)), 1)), eml(1, eml(eml(1, eml(y, 1)), 1))), 1), 1)), 1)

From Table 4, I think addition is slightly more complicated?

  • Thanks for posting that. You had a transcribing typo which was corrected in the ECMAScript below. Here's the calculation for 5 x 7:

        const eml = (x,y) => Math.exp(x) - Math.log(y);
        const mul = (x,y) => eml(eml(1,eml(eml(eml(1,eml(eml(1,eml(1,x)),1)),eml(1,eml(eml(1,eml(y,1)),1))),1)),1);
        console.log(mul(5,7));
    

    > 35.00000000000001

    For larger or negative inputs you get a NaN because ECMAScript has limited precision and doesn't handle imaginary numbers.

  • x+y = ln(exp(x) * exp(y))

    exp(a) = eml(a, 1) ln(a)=eml(1,eml(eml(1,a),1))

    Plugging those in is an excercise to the reader

    • You use multiplication in the first line, which you have not expressed through eml yet.

      Because of how exp and log turn addition into multiplication and vice versa, once you have the one, you get the other easily.