You getting stuck in an infinite loop here:
while(live){
if(!(r.num%2 && r.den%2)){
r.num/=2;
r.den/=2;
}
…
}
For example, when r.num == 1
and r.den == 2
, consider what's happening:
Iteration 1
r.num % 2 == 1 % 2 == 1
r.den % 2 == 2 % 2 == 0
!(1 && 0) == 1
r.num / 2 == 1 / 2 == 0
r.den / 2 == 2 / 2 == 1
Iteration 2
r.num % 2 == 0 % 2 == 0
r.den % 2 == 1 % 2 == 1
!(0 && 1) == 1
r.num / 2 == 0 / 2 == 0
r.den / 2 == 1 / 2 == 0
Iteration 3 to infinity and beyond…
r.num % 2 == 0 % 2 == 0
r.den % 2 == 0 % 2 == 0
!(0 && 0) == 1
r.num / 2 == 0 / 2 == 0
r.den / 2 == 0 / 2 == 0
Change the expressions in the branching statements to something like this to correct your logic:
while(live)
{
if((r.num % 2 == 0) && (r.den % 2 == 0))
{
r.num /= 2;
r.den /= 2;
}
…
}