Reputation: 925
Solving one bug I came to some interesting discoveries.
The result of this procedure
static void Main(string[] args)
{
int i4 = 4;
Console.WriteLine("int i4 = 4;");
Console.WriteLine("i4 % 1 = {0}", i4 % 1);
double d4 = 4.0;
Console.WriteLine("double d4 = 4.0;");
Console.WriteLine("d4 % 1 = {0}", d4 % 1);
Console.WriteLine("-----------------------------------------------------------");
int i64 = 64;
double dCubeRootOf64 = Math.Pow(i64, 1.0 / 3.0);
Console.WriteLine("int i64 = 64;");
Console.WriteLine("double dCubeRootOf64 = Math.Pow(i64, 1.0 / 3.0) = {0}", dCubeRootOf64);
Console.WriteLine("dCubeRootOf64 = {0}", dCubeRootOf64);
Console.WriteLine("dCubeRootOf64 % 1 = {0} ?????????????? Why 1. ??????????", dCubeRootOf64 % 1);
Console.ReadLine();
}
is
int i4 = 4;
i4 % 1 = 0
double d4 = 4.0;
d4 % 1 = 0
-----------------------------------------------------------
int i64 = 64;
double dCubeRootOf64 = Math.Pow(i64, 1.0 / 3.0) = 4
dCubeRootOf64 = 4
dCubeRootOf64 % 1 = 1 ?????????????? Why 1. ??????????
int 4 % 1 = 0
-- correct
double 4.0 % 1 = 0
-- correct
But bug is in:
Math.Pow(64, 1.0 / 3.0) % 1 = 1
Cube root from 64 is 4. Why is in that case 4 % 1 = 1
?
Upvotes: 7
Views: 1673
Reputation: 77876
dCubeRootOf64 % 1 = 1
returns 1 instead 0; cause Math.Pow(i64, 1.0 / 3.0)
returns 3.9999999999999996
and 3.9999999999999996 % 1
returns 0.99999999999999956
which in turn getting rounded to 1.
Thus the result 1.
Upvotes: 3
Reputation: 887433
Math.Pow(64, 1.0 / 3.0)
returns 3.9999999999999996
.
This gets rounded to 4
when displayed.
Taking it modulo 1 returns 0.99999999999999956
, which is similarly rounded to 1
when displayed.
You can see the true values by adding .ToString("R")
Upvotes: 12