A direct solution might look like this:
public class Scribble { public static void main(String[] args) { for (int i = 1; i <= 10; i++) { double d = 1d / ((double)i); float f = (float) d; boolean lossless = d == f; System.out.println(d + " can be converted " + (lossless ? "lossless" : "only with loss")); } } }
output:
1.0 can be converted lossless 0.5 can be converted lossless 0.3333333333333333 can be converted only with loss 0.25 can be converted lossless 0.2 can be converted only with loss 0.16666666666666666 can be converted only with loss 0.14285714285714285 can be converted only with loss 0.125 can be converted lossless 0.1111111111111111 can be converted only with loss 0.1 can be converted only with loss
edit: speed comparison shows method2 seems to be the fastest:
method1 | method2 | method3 237094654 | 209365345 | 468025911 214129288 | 209917275 | 448695709 232093486 | 197637245 | 448153336 249210162 | 200163771 | 460200921 240685446 | 200638561 | 447061763 332890287 | 337870633 | 450452194 247054322 | 199045232 | 449442540 235533069 | 200767924 | 452743201 256274670 | 199153775 | 453373979 298277375 | 198659529 | 456672251 229360115 | 205883096 | 454198291 252680123 | 224850463 | 452860277 246047739 | 200070587 | 458091501 304270790 | 204517093 | 463688631 235058620 | 204675812 | 448639390 260565871 | 205834286 | 458372075 256008432 | 242574024 | 498943242 311210028 | 208080237 | 478777466 242014926 | 208995343 | 457901380 239893559 | 205111348 | 451616471
code:
public class Scribble { static int size = 1024*1024*100; static boolean[] results = new boolean[size]; static double[] values = new double[size]; public static void main(String[] args) { // generate values for (int i = 0; i < size; i++) values[i] = 1d / ((double)i); long start; long duration; System.out.println(" method1 | method2 | method3 "); for (int i = 0; i < 20; i++) { start = System.nanoTime(); method1(size); duration = System.nanoTime() - start; System.out.printf("%9d", duration); start = System.nanoTime(); method2(size); duration = System.nanoTime() - start; System.out.printf(" | %9d", duration); start = System.nanoTime(); method3(size); duration = System.nanoTime() - start; System.out.printf(" | %9d\n", duration); } } private static void method1(int size) { boolean[] results = new boolean[size]; for (int i = 0; i < size; i++) { double d = values[i]; float f = (float) d; boolean lossless = d == f; results[i] = lossless; } } private static void method2(int size) { for (int i = 0; i < size; i++) { double d = values[i]; results[i] = d == (double)(float)d; } } private static void method3(int size) { for (int i = 0; i < size; i++) { double d = values[i]; results[i] = Double.compare(d, (float) d) == 0; } } }
source share