So i wrote a recursive function for Pow() and the return value for 2^int.MaxValue/2 is "?". Atleast that is written into the Console. Why is that?
(yes i know recursion bad... but that was my assignment)
Code:
public static double Pow(double x, int y)
{
if (y > 0)
{
if (y == 1)
{
return x;
}
return Pow(x, y / 2) * Pow(x, (y + 1) / 2);
}
else if (y == 0)
return 1;
else
{
if (y == -1)
{
return 1 / x;
}
return Pow(x, y / 2) * Pow(x, (y - 1) / 2);
}
}
Main:
public static void Main()
{
Console.WriteLine($"3^3 = {MyMath.Pow(3, 3)}");
Console.WriteLine($"3^2 = {MyMath.Pow(3, 2)}");
Console.WriteLine($"3^1 = {MyMath.Pow(3, 1)}");
Console.WriteLine($"3^0= {MyMath.Pow(3, 0)}");
double d1 = MyMath.Pow(2, int.MaxValue / 2);
double d2 = MyMath.Pow(2, int.MaxValue);
long l1 = BitConverter.DoubleToInt64Bits(d1);
long l2 = BitConverter.DoubleToInt64Bits(d2);
string s1 = Convert.ToString(l1, 2);
string s2 = Convert.ToString(l1, 2);
Console.WriteLine($"Pow: 2^{int.MaxValue / 2}={d1}");
Console.WriteLine($"Pow: 2^{int.MaxValue}={d2}");
Console.WriteLine($"Pow: 2^{int.MaxValue / 2}={l1}");
Console.WriteLine($"Pow: 2^{int.MaxValue}={l2}");
Console.WriteLine($"Pow: 2^{int.MaxValue / 2}={s1}");
Console.WriteLine($"Pow: 2^{int.MaxValue}={s2}");
}
Output:
3^3 = 27
3^2 = 9
3^1 = 3
3^0= 1
Pow: 2^1073741823=?
Pow: 2^2147483647=NaN
Pow: 2^1073741823=9218868437227405312
Pow: 2^2147483647=-2251799813685248
Pow: 2^1073741823=111111111110000000000000000000000000000000000000000000000000000
Pow: 2^2147483647=111111111110000000000000000000000000000000000000000000000000000
Cpu: i5-7500 3.40GHz, 4cores