SelvirK
SelvirK

Reputation: 925

C# Bug in Modulo Operator %

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

Answers (2)

Rahul
Rahul

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

SLaks
SLaks

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

Related Questions