Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Question about this java program

  1. Oct 28, 2007 #1
    OK here is my source code for a small Java program I wrote to approximate the number e:

    Code (Text):

    import java.util.Scanner;

    public class E
    {
        public static void main (String[] args)
        {
            double e = 0.00, current_e = 0.00;
            int x, number_of_digits;
            Scanner scan = new Scanner (System.in);

            System.out.println("How many digits?");
            number_of_digits = scan.nextInt();

            for (x=1; x<number_of_digits; x++)
            {
                current_e = (1 + (1/x)) ^ x;
                e += current_e;
            }

            System.out.println("e = " + e);
        }
    }
     
    What's wrong with this code? When I run this program and enter 100000 for number_of_digits, I get a result of e = 4.999950002E9. What's up with this?

    P.S.: This is the latest Java SDK (1.6) I am compiling this program in.
     
  2. jcsd
  3. Oct 28, 2007 #2

    George Jones

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    You're using the wrong series for e.

    Your series:

    [tex]e = \left(1 + \frac{1}{1} \right)^1 + \left(1 + \frac{1}{2} \right)^2 + \left(1 + \frac{1}{3} \right)^3 + ...[/tex]

    Correct series:
    [tex]e = 1 +\frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + ...[/tex]

    You've used the limit expression for e instead of the series expression for e.

    Also, you might want to sum the series "backwards".
     
  4. Oct 28, 2007 #3
    At x = 1, your code sets e = (1 + 1)^1 = 2. At x = 2, your code sets e = 2 + (1.5)^2 = 2 + 2.25 = 4.25. At x = 3, your code sets e = 4.25 + (4/3)^3 ~= 6.6. I leave it as an exercise for you to figure out what's going (seriously) wrong here.
     
  5. Oct 28, 2007 #4

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    There are many things wrong with this.
    • the expression for e is

      [tex]e=\lim_{x\to\infty}(1+1/x)^x[/tex]

      You are computing the sum, not the limit.
    • You declared x as an integer. For all x but x=1, 1/x is zero.
    • You are using ^ for exponentiation. In Java, ^ represents the exclusive or operator. For x=1, 1+1/x evaluates to 2 and (1+1/x)^x is 3. For all other x, 1+1/x is just 1 =x. If x is even, 1^x is x+1. If x is odd, 1^x is x-1. Those plus and minus ones more or less cancel leaving just

      [tex]\text{current\_e} = \sum_{x=1}^{N-1} x[/tex]

      which is just N(N-1)/2. With N= 100000, this becomes 50000*99999=4.99995e9.

    Use the right formula and use floating point numbers rather than integers where you need floating point numbers.
     
  6. Oct 28, 2007 #5
    Oh, OK I see what all of you are trying to say. I am adding each approximation of e for each integer x which means my sum is going to be huge...so what I did was I took out the loop completely and just plugged in the number the user enters for x.

    Code (Text):

    import java.util.Scanner;
    import java.lang.Math;

    public class E
    {
        public static void main (String[] args)
        {
            double e = 0.00, x;
            Scanner scan = new Scanner (System.in);

            System.out.println("Please enter a positive integer or decimal number:");
            x = scan.nextDouble();

            e = Math.pow((1+(1/x)), x);

            System.out.println("e = " + e);
        }
    }
     
    And this is what happens when I enter 1 million for x:

    Code (Text):
    ken@ken-laptop:~/java$ java E
    Please enter a positive integer or decimal number:
    1000000
    e = 2.7182804690957534
     
    Ta da!
     
    Last edited by a moderator: Oct 28, 2007
  7. Oct 28, 2007 #6

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    Ta da!

    Were you supposed to use a series or the limit expression? Using math.pow() is "cheating" in a sense, as this function evaluates [itex]a^b[/itex] via the relation [itex]a^b = \exp(b\log a)[/itex].
     
  8. Oct 28, 2007 #7
    To make this way easier I used the limit expression (no looping required) instead of the series expression.

    Yeah, I see your point about the Math.pow() function in Java. Maybe if I have more time I'll try writing a better exponent function. I just started learning this language and I have to say it is pretty interesting.
     
    Last edited by a moderator: Oct 28, 2007
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Question about this java program
  1. Java programs (Replies: 9)

  2. Java Programming (Replies: 12)

  3. Question about Java (Replies: 4)

Loading...