Page 1 of 1

About Question enthuware.ocajp.i.v7.-2-.1372 :

Posted: Mon Jun 18, 2018 11:05 am
by flex567
Aha but it would work for factorial(1000)?

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Mon Jun 18, 2018 11:19 am
by admin
What happened when you tried it out?

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Mon Jun 18, 2018 12:29 pm
by flex567

Code: Select all

public class Temp{

	public static void main(String args[]){
	
	System.out.println(factorial(1000));
	
	}
	
	static int factorial(int n){
	   if(n==1) return 1;
	   else return n*factorial(n-1);
	}
}
I don't get any exception but I do get back 0. Why is that ?

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Tue Jun 19, 2018 3:20 am
by admin
Here are a few pointers - What is the largest number that an int variable can hold? What is the value of factorial(1000)? What happens when you add 1 to an int variable that is already set to the largest value that it can hold?

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Tue Jun 19, 2018 12:16 pm
by flex567
largest number = -2 147 483 648 ...+2 147 483 647
factorial(1000) =
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

>What happens when you add 1 to an int variable that is already set to the largest value that it can hold?
It gets multiplied by zero at somepoint?

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Tue Jun 19, 2018 12:34 pm
by flex567
It goes around from start

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Wed Jun 20, 2018 4:16 am
by admin
I hope you got the answer you were looking for. The point is an int variable cannot store a number larger than Integer.MAX_VALUE ( which is nothing but 2^32 - 1). As soon as your factorial value gets larger than this, the variable will overflow. This is not important for the exam though, so I wouldn't spend more time on it.

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Wed Jun 20, 2018 11:37 am
by flex567
I undersdand that overflow will happen but don't understand why it is 0.
If you increase Integer.MAX_VALUE + 3 overflow happens but it is not 0.

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Wed Jun 20, 2018 8:21 pm
by admin
But you are not adding 3 in the program. See this for full detail:
https://docs.oracle.com/javase/specs/jl ... ls-15.17.1

Re: About Question enthuware.ocajp.i.v7.2.1372 :

Posted: Thu Jun 21, 2018 12:31 pm
by flex567
I didn't find the reason for 0 in the link you provided. Is it maybe this:
>If the magnitude of the product is too large to represent, we say the operation overflows; the result is then an infinity of appropriate sign.

Re: About Question enthuware.ocajp.i.v7.-2-.1372 :

Posted: Thu Jun 21, 2018 11:43 pm
by admin
It does overflow and because of overflow the result swings between negative and positive. In one of the steps, the value of the factorial becomes zero. Once factorial becomes zero, next factorial will also be zero.
You may run the program with print statements and see the value of n and factorial at each step.