Java Question about this java program

  • Thread starter Thread starter vsingh165
  • Start date Start date
  • Tags Tags
    Java Program
Click For Summary
The discussion revolves around a Java program intended to approximate the mathematical constant e. The initial code incorrectly uses the limit expression for e instead of the correct series expansion, leading to inaccurate results. Key issues identified include the misuse of the exponentiation operator (^), which in Java represents the exclusive OR operator, and the declaration of x as an integer, causing loss of precision in calculations. Suggestions for improvement emphasize using the correct series for e, which involves factorials, and utilizing floating-point numbers for accurate computations. The user later modifies the program to directly compute e using the limit expression with the Math.pow() function, achieving a more accurate result. However, there are concerns about the reliance on Math.pow() as it may be seen as "cheating" since it abstracts the underlying calculations. The conversation highlights the importance of understanding mathematical concepts and their correct implementation in programming.
vsingh165
OK here is my source code for a small Java program I wrote to approximate the number e:

Code:
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.
 
Technology news on Phys.org
You're using the wrong series for e.

Your series:

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

Correct series:
e = 1 +\frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + ...

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

Also, you might want to sum the series "backwards".
 
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.
 
There are many things wrong with this.
  • the expression for e is

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

    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

    \text{current\_e} = \sum_{x=1}^{N-1} x

    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.
 
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:
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:
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:
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 a^b via the relation a^b = \exp(b\log a).
 
D H said:
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 a^b via the relation a^b = \exp(b\log a).


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:

Similar threads

  • · Replies 8 ·
Replies
8
Views
2K
Replies
8
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 0 ·
Replies
0
Views
626
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 14 ·
Replies
14
Views
6K
  • · Replies 1 ·
Replies
1
Views
7K