how to calculate Exponential function by using vba

In inputbox input x and n
exponential function : e^x=1+ x/1! + x^2/2! +.....x^n/n!       ; n!=1*2*3...*n
inside the function we can use t(n)=x^n/n!  and for recurrence formula t(n)=t(n-1)*x/n
The partial sum to the n-th clause is expressed with s(n) which is ; s(n)=s(n-1)+t(n)
then e=1+s(n)
the calculation will repeat until i=n and |t(n)|<0.001

the problem is when i run the program the answer is no same with the exponential function above.


Sub e2()
    Dim n As Double
    Dim x As Double
    Dim i As Double
    Dim tn As Double
    Dim sn As Double
    Dim t1 As Double
    Dim e As Double
   
    x = CInt(InputBox("x?"))
    n = CInt(InputBox("n?"))
   
    Do
        For i = 1 To n
            t1 = x / (n - 1)
            tn = (x / (n - 1)) * (x / n)
            sn = tn + t1
            e = 1 + sn
           
            If x = 0 Then Exit For
       
        Next i
    Loop Until tn < 0.001 Or -tn < 0.001
   
    MsgBox "e^" & CStr(x) & "=" & CStr(e)
       
End Sub
edirolAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

WaterStreetCommented:
instead of    

 x = CInt(InputBox("x?"))
    n = CInt(InputBox("n?"))

try
    x = CDbl(InputBox("x?"))
    n = CDbl(InputBox("n?"))


0
edirolAuthor Commented:
thanks WaterStreet

i`d tried CDbl but the answer is still wrong.
for example x=2,n=3 the answer should be e^2=6.3333
i think there are something wrong with the formulas for t1,tn
0
zorvek (Kevin Jones)ConsultantCommented:
Sub e2()

   Dim n As Double
   Dim x As Double
   Dim e As Double
   Dim Laste As Double
   
   x = CInt(InputBox("x?"))
   
   e = 1
   x = 3
   n = 1
   Do
      Laste = e
      e = e + x ^ n / Factorial(n)
      n = n + 1
   Loop While Abs(e - Laste) > 0.0000001
   
   MsgBox "e^" & x & "=" & e
       
End Sub

Public Function Factorial(ByRef Value As Double) As Double

   If Value = 1 Then
      Factorial = 1
      Exit Function
   Else
      Factorial = Value * Factorial(Value - 1)
   End If

End Function

Kevin
0
Exploring SharePoint 2016

Explore SharePoint 2016, the web-based, collaborative platform that integrates with Microsoft Office to provide intranets, secure document management, and collaboration so you can develop your online and offline capabilities.

deightonprogCommented:
here's a solution that avoids using the ^ operator, there's not much point in doing that, cos you could hard code e as a constant and do e^n in code.


Anyway, your keeping of a running total for the value seemed to be in error.

        Dim n As Double
        Dim x As Double
        Dim i As Double
        Dim tn As Double
        Dim sn As Double
        Dim t1 As Double
        Dim e As Double

      x = CInt(InputBox("x?"))
    n = CInt(InputBox("n?"))

        e = 0

        tn = 1
        e = e + tn

        'now e is the first term in the taylor expansion (call this term 0)

        Do

            'add on term 1, 2, 3

            i = i + 1
            tn = tn * x / i       'this gets the next term from the last

            e = e + tn

            'If x = 0 Then Exit For -    not needed, gives tn=0 when x = 0, so it ends below

            'the end ing condition wasn't true
        Loop Until tn < 0.001 And tn >= 0 Or -tn < 0.001 And tn <= 0

       msgbox ("e^" & CStr(x) & "=" & CStr(e))
0
edirolAuthor Commented:
thanks Kevin.
i`d tried your solution and it is working!!!however i have to make the program by using the
functions in the question.

Actually i found that i  misunderstood the question.This is the question again ;
Exponential function : e^x=1+ x/1! + x^2/2! +.....x^n/n!       ; n!=1*2*3...*n
Inside the function we can use t(n)=x^n/n!  and for recurrence formula t(n)=t(n-1)*x/n
The partial sum to the n-th clause is expressed with s(n) which is ; s(n)=s(n-1)+t(n)
Then e=1+s(n)
The calculation will repeat until n=100 and |t(n)|<0.001

Sub e21()
    Dim x As Double
    Dim n As Double
    Dim i As Double
    Dim t1 As Double
    Dim tn As Double
    Dim sn As Double
    Dim e As Double
   
     
    x = CDbl(InputBox("x?"))
   
    Do
        For n = 1 To 100
            t1 = x / (n - 1)
            tn = (x / (n - 1)) * (x / n)
            sn = tn + t1
            e = 1 + sn
           
            If x = 0 Then Exit For
       
        Next n
    Loop Until tn < 0.001 Or -tn < 0.001
   
    MsgBox "e^" & CStr(x) & "=" & CStr(e)
End Sub

I`d  tried to run the program but it comes into debug.
For example if x=3
     e^3=20.0855....
0
deightonprogCommented:
for one thing, you've got looping Until tn < 0.001 Or -tn < 0.001

, but if say tn=3, then -tn < .001 and the loop ends


0
deightonprogCommented:
also if you look at

  For n = 1 To 100
            t1 = x / (n - 1)



then where n=1, you have an immediate division by zero in the second line
0
edirolAuthor Commented:
already tried to change the functions.but still wrong
0
deightonprogCommented:
your calculation of the terms in the series is not right.  The first term has to be calculated before you go into the loop, but that's always 1.

t0 = 1
t1 = t0 * x / 1
t2 = t1 * x / 2
t3 = t2 * x / 3

t(n) = t(n-1) * x / n


but you don't want to store all those values, you want to calculate the next term from the previous and throw away the old one - so lets call the nth term variable 'tn'

first consider this

---------------------------------------------------------------------
dim tn as double

x=2
tn = 1
for n = 1 to 10
   tn = tn * x/n
  msgbox("term " + cstr(n) + " = " + cstr(tn))
next
---------------------------------------------------------------------

so looking at the code above, I calculate each of the first 10  term in the series.  But I want to add them all up, including t0, so then I need running_total
---------------------------------------------------------------------
x=2
 tn = 1
running_total = tn

 for n = 1 to 100
    tn = tn * x/n
  running_total = running_total + tn
 
 next
---------------------------------------------------------------------
'at the end of this, the value is in running total

do you see what this bit does
   tn = tn * x/n

it takes the last term and works out the latest term from it.

 
0
edirolAuthor Commented:
Thanks deighton ;
 I`d  changed  my program by referring your functions and it works.
But how can i make that program to calculate until abs(tn)<0.0001?
I did `Step Into ` and in `Locals Window`  when Abs(tn)<0.0001 it should
stop running,but it still run until n=100.

Sub ee()

    Dim x As Double
    Dim n As Double
    Dim tn As Double
    Dim running_total As Double

    x = CDbl(InputBox("x"))
    tn = 1
    running_total = tn

    Do
        For n = 1 To 100
            tn = tn * x / n
            running_total = running_total + tn
        Next n
    Loop Until Abs(tn) < 0.00001

    MsgBox CStr(running_total)
End Sub

0
deightonprogCommented:
if you look at that, you have a for loop 'nested' in the Do loop, so you will always do 100 iterations, then you will break out of the second loop only if abs(tn) < .00001,

if you get rid of the do loop and have

  For n = 1 To 100
            tn = tn * x / n
            running_total = running_total + tn
            if Abs(tn) < 0.00001 then exit for
        Next n

you will iterate for a maximum of 100 times, but leaving the loop if tn < .00001

is one way of doing that

you could also use a do loop with a counter and the loop until n>100 or abs(tn)<.000001


0
edirolAuthor Commented:

At last !!!Thanks deighton.
Anyway can u explain why does tn = 1& sn = tn
0
deightonprogCommented:
tn = 1

this is setting tn to the first term in the series, which is always 1

 tn = tn * x / n

this calculates the next value in the series each time
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Algorithms

From novice to tech pro — start learning today.