How does conversion from double to int work in Java?

For the following code (Java):

double d = (double) m / n; //m and n are integers, n>0
int i = (int) (d * n);

i == m

Is the last expression always true? If this is not always the case ?:

i = (int) Math.round(d * n);

i == m
+5
source share
4 answers

The second question you ask is how big is ulp in Java.

ulp 1/(n), int. , ulps . , , 1 9E15; , round(), . , int, Integer.MAX_VALUE.

n, , int:

  public static void main(String[] args)
  {
    // start with large number
    int m = Integer.MAX_VALUE;
    double d = 0;

    double largestError = 0;
    int bigErrorCause = -1;
    for (int n = 1; n < Integer.MAX_VALUE; n++)
    {
      d = (double) m / n;
      double possibleError = Math.ulp(d) * n;
      if (possibleError > largestError)
      {
        largestError = possibleError;
        bigErrorCause = n;
      }
    }
    System.out.println("int " + bigErrorCause + " causes at most "
        + largestError + " error");
  }

:

int 1073741823 4.768371577590358E-7

, Math.round, int int.

+4

int i = (int) (d * n); i == m;

m = 1, n = 49.

i = (int) Math.round(d * n); i == m;

, , .

+5

. , , , . , ==.

, :

Math.abs( d*n - m ) < 0.000001;

,

i = (int) (d * n);
i = (int) Math.round(d * n);

, , d=3/2 n=2, i=2.999999999999, / 2.

+1

. -, , , , , .

If n is very large, it may be false, I'm not sure. I know that this will be true, at least in 99% of cases.

+1
source

All Articles