Skip to content

More efficient comparison of the same and finite numbers#82

Merged
agdavydov81 merged 1 commit intoepam:masterfrom
plokhotnyuk:patch-1
Jul 27, 2023
Merged

More efficient comparison of the same and finite numbers#82
agdavydov81 merged 1 commit intoepam:masterfrom
plokhotnyuk:patch-1

Conversation

@plokhotnyuk
Copy link
Copy Markdown

@plokhotnyuk plokhotnyuk commented Jul 3, 2023

It speeds up the comparison operation in 1.2x-1.5x times for the same and finite numbers, while slows down comparison of NaN and Infinity numbers in 1.1x-1.5x times

  1. CASE 2 moved to be tested first
  2. CASE 1 & 3 tested only for numbers that have steering bits
  3. CASE 4 refactored to fast passing for non-zero values
  4. CASE 5 refactored to remove redundant comparisons

The following benchmark was used to test performance:

package com.epam.deltix.dfp;

import org.openjdk.jmh.annotations.*;

import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(time = 1, iterations = 3)
@Measurement(time = 1, iterations = 3)
@Fork(3)
@State(Scope.Thread)
public class CompareBenchmark {
    /* 0., 1., 1. (non-canonized), 1000., Inf, NaN */
    @Param({"3584865303386914816", "3584865303386914817", "3450757314565799936", "3584865303386915816", "8646911284551352320", "8935141660703064064"})
    private long x;

    /* 0., 1., 1. (non-canonized), 1000., Inf, NaN */
    @Param({"3584865303386914816", "3584865303386914817", "3450757314565799936", "3584865303386915816", "8646911284551352320", "8935141660703064064"})
    private long y;

    @Benchmark
    public int compareTo() {
        return JavaImplCmp.compare(x, y);
    }
}

Bellow are results from Core i7-11700 on different JVMs.

Oracle GraalVM JDK 20

Before

Benchmark                                   (x)                  (y)  Mode  Cnt  Score   Error  Units
CompareBenchmark.compareTo  3584865303386914816  3584865303386914816  avgt    9  0.721 ± 0.001  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386914817  avgt    9  1.442 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914816  3450757314565799936  avgt    9  1.442 ± 0.004  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386915816  avgt    9  1.442 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914816  8646911284551352320  avgt    9  0.943 ± 0.013  ns/op
CompareBenchmark.compareTo  3584865303386914816  8935141660703064064  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914816  avgt    9  1.441 ± 0.002  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914817  avgt    9  0.721 ± 0.001  ns/op
CompareBenchmark.compareTo  3584865303386914817  3450757314565799936  avgt    9  3.618 ± 0.014  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386915816  avgt    9  1.854 ± 0.002  ns/op
CompareBenchmark.compareTo  3584865303386914817  8646911284551352320  avgt    9  0.939 ± 0.011  ns/op
CompareBenchmark.compareTo  3584865303386914817  8935141660703064064  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914816  avgt    9  1.441 ± 0.003  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914817  avgt    9  3.789 ± 0.082  ns/op
CompareBenchmark.compareTo  3450757314565799936  3450757314565799936  avgt    9  0.721 ± 0.001  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386915816  avgt    9  3.742 ± 0.016  ns/op
CompareBenchmark.compareTo  3450757314565799936  8646911284551352320  avgt    9  0.939 ± 0.015  ns/op
CompareBenchmark.compareTo  3450757314565799936  8935141660703064064  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914816  avgt    9  1.442 ± 0.001  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914817  avgt    9  1.853 ± 0.002  ns/op
CompareBenchmark.compareTo  3584865303386915816  3450757314565799936  avgt    9  3.727 ± 0.011  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386915816  avgt    9  0.721 ± 0.002  ns/op
CompareBenchmark.compareTo  3584865303386915816  8646911284551352320  avgt    9  0.949 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386915816  8935141660703064064  avgt    9  0.619 ± 0.001  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914816  avgt    9  0.944 ± 0.011  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914817  avgt    9  0.948 ± 0.005  ns/op
CompareBenchmark.compareTo  8646911284551352320  3450757314565799936  avgt    9  0.947 ± 0.005  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386915816  avgt    9  0.949 ± 0.005  ns/op
CompareBenchmark.compareTo  8646911284551352320  8646911284551352320  avgt    9  0.721 ± 0.001  ns/op
CompareBenchmark.compareTo  8646911284551352320  8935141660703064064  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914816  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914817  avgt    9  0.618 ± 0.002  ns/op
CompareBenchmark.compareTo  8935141660703064064  3450757314565799936  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386915816  avgt    9  0.618 ± 0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  8646911284551352320  avgt    9  0.619 ± 0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  8935141660703064064  avgt    9  0.618 ± 0.001  ns/op

After

Benchmark                                   (x)                  (y)  Mode  Cnt  Score    Error  Units
CompareBenchmark.compareTo  3584865303386914816  3584865303386914816  avgt    9  0.514 ±  0.001  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386914817  avgt    9  0.950 ±  0.007  ns/op
CompareBenchmark.compareTo  3584865303386914816  3450757314565799936  avgt    9  0.948 ±  0.006  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386915816  avgt    9  0.949 ±  0.010  ns/op
CompareBenchmark.compareTo  3584865303386914816  8646911284551352320  avgt    9  1.235 ±  0.001  ns/op
CompareBenchmark.compareTo  3584865303386914816  8935141660703064064  avgt    9  0.927 ±  0.002  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914816  avgt    9  0.949 ±  0.008  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914817  avgt    9  0.514 ±  0.001  ns/op
CompareBenchmark.compareTo  3584865303386914817  3450757314565799936  avgt    9  3.032 ±  0.003  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386915816  avgt    9  1.442 ±  0.002  ns/op
CompareBenchmark.compareTo  3584865303386914817  8646911284551352320  avgt    9  1.235 ±  0.002  ns/op
CompareBenchmark.compareTo  3584865303386914817  8935141660703064064  avgt    9  0.927 ±  0.001  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914816  avgt    9  0.949 ±  0.008  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914817  avgt    9  3.122 ±  0.009  ns/op
CompareBenchmark.compareTo  3450757314565799936  3450757314565799936  avgt    9  0.514 ±  0.001  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386915816  avgt    9  3.109 ±  0.010  ns/op
CompareBenchmark.compareTo  3450757314565799936  8646911284551352320  avgt    9  1.236 ±  0.001  ns/op
CompareBenchmark.compareTo  3450757314565799936  8935141660703064064  avgt    9  0.927 ±  0.001  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914816  avgt    9  0.948 ±  0.006  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914817  avgt    9  1.648 ±  0.004  ns/op
CompareBenchmark.compareTo  3584865303386915816  3450757314565799936  avgt    9  3.085 ±  0.006  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386915816  avgt    9  0.514 ±  0.001  ns/op
CompareBenchmark.compareTo  3584865303386915816  8646911284551352320  avgt    9  1.236 ±  0.001  ns/op
CompareBenchmark.compareTo  3584865303386915816  8935141660703064064  avgt    9  0.926 ±  0.001  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914816  avgt    9  1.235 ±  0.002  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914817  avgt    9  1.235 ±  0.002  ns/op
CompareBenchmark.compareTo  8646911284551352320  3450757314565799936  avgt    9  1.235 ±  0.002  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386915816  avgt    9  1.236 ±  0.003  ns/op
CompareBenchmark.compareTo  8646911284551352320  8646911284551352320  avgt    9  0.514 ±  0.001  ns/op
CompareBenchmark.compareTo  8646911284551352320  8935141660703064064  avgt    9  0.926 ±  0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914816  avgt    9  0.927 ±  0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914817  avgt    9  0.927 ±  0.002  ns/op
CompareBenchmark.compareTo  8935141660703064064  3450757314565799936  avgt    9  0.927 ±  0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386915816  avgt    9  0.927 ±  0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  8646911284551352320  avgt    9  0.926 ±  0.001  ns/op
CompareBenchmark.compareTo  8935141660703064064  8935141660703064064  avgt    9  0.514 ±  0.001  ns/op

OpenJDK 17

Before

Benchmark                                   (x)                  (y)  Mode  Cnt  Score   Error  Units
CompareBenchmark.compareTo  3584865303386914816  3584865303386914816  avgt    9  1.789 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386914817  avgt    9  2.997 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914816  3450757314565799936  avgt    9  2.995 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386915816  avgt    9  2.995 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386914816  8646911284551352320  avgt    9  2.061 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914816  8935141660703064064  avgt    9  1.702 ± 0.004  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914816  avgt    9  2.997 ± 0.006  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914817  avgt    9  1.789 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914817  3450757314565799936  avgt    9  5.421 ± 0.038  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386915816  avgt    9  3.839 ± 0.020  ns/op
CompareBenchmark.compareTo  3584865303386914817  8646911284551352320  avgt    9  2.064 ± 0.004  ns/op
CompareBenchmark.compareTo  3584865303386914817  8935141660703064064  avgt    9  1.703 ± 0.004  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914816  avgt    9  2.997 ± 0.009  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914817  avgt    9  5.846 ± 0.020  ns/op
CompareBenchmark.compareTo  3450757314565799936  3450757314565799936  avgt    9  1.789 ± 0.003  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386915816  avgt    9  5.960 ± 0.010  ns/op
CompareBenchmark.compareTo  3450757314565799936  8646911284551352320  avgt    9  2.063 ± 0.002  ns/op
CompareBenchmark.compareTo  3450757314565799936  8935141660703064064  avgt    9  1.704 ± 0.002  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914816  avgt    9  2.996 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914817  avgt    9  3.634 ± 0.006  ns/op
CompareBenchmark.compareTo  3584865303386915816  3450757314565799936  avgt    9  5.851 ± 0.009  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386915816  avgt    9  1.790 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386915816  8646911284551352320  avgt    9  2.064 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386915816  8935141660703064064  avgt    9  1.702 ± 0.003  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914816  avgt    9  1.972 ± 0.005  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914817  avgt    9  1.973 ± 0.007  ns/op
CompareBenchmark.compareTo  8646911284551352320  3450757314565799936  avgt    9  1.975 ± 0.005  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386915816  avgt    9  1.978 ± 0.015  ns/op
CompareBenchmark.compareTo  8646911284551352320  8646911284551352320  avgt    9  1.790 ± 0.004  ns/op
CompareBenchmark.compareTo  8646911284551352320  8935141660703064064  avgt    9  1.702 ± 0.003  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914816  avgt    9  1.703 ± 0.002  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914817  avgt    9  1.703 ± 0.004  ns/op
CompareBenchmark.compareTo  8935141660703064064  3450757314565799936  avgt    9  1.703 ± 0.004  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386915816  avgt    9  1.704 ± 0.004  ns/op
CompareBenchmark.compareTo  8935141660703064064  8646911284551352320  avgt    9  1.958 ± 0.642  ns/op
CompareBenchmark.compareTo  8935141660703064064  8935141660703064064  avgt    9  1.713 ± 0.004  ns/op

After

Benchmark                                   (x)                  (y)  Mode  Cnt  Score   Error  Units
CompareBenchmark.compareTo  3584865303386914816  3584865303386914816  avgt    9  1.374 ± 0.002  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386914817  avgt    9  2.170 ± 0.004  ns/op
CompareBenchmark.compareTo  3584865303386914816  3450757314565799936  avgt    9  2.171 ± 0.014  ns/op
CompareBenchmark.compareTo  3584865303386914816  3584865303386915816  avgt    9  2.168 ± 0.006  ns/op
CompareBenchmark.compareTo  3584865303386914816  8646911284551352320  avgt    9  2.283 ± 0.014  ns/op
CompareBenchmark.compareTo  3584865303386914816  8935141660703064064  avgt    9  1.972 ± 0.012  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914816  avgt    9  2.170 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386914817  avgt    9  1.375 ± 0.003  ns/op
CompareBenchmark.compareTo  3584865303386914817  3450757314565799936  avgt    9  4.258 ± 0.007  ns/op
CompareBenchmark.compareTo  3584865303386914817  3584865303386915816  avgt    9  2.682 ± 0.006  ns/op
CompareBenchmark.compareTo  3584865303386914817  8646911284551352320  avgt    9  2.295 ± 0.014  ns/op
CompareBenchmark.compareTo  3584865303386914817  8935141660703064064  avgt    9  1.971 ± 0.006  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914816  avgt    9  2.169 ± 0.006  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386914817  avgt    9  4.468 ± 0.005  ns/op
CompareBenchmark.compareTo  3450757314565799936  3450757314565799936  avgt    9  1.375 ± 0.002  ns/op
CompareBenchmark.compareTo  3450757314565799936  3584865303386915816  avgt    9  4.825 ± 0.006  ns/op
CompareBenchmark.compareTo  3450757314565799936  8646911284551352320  avgt    9  2.292 ± 0.011  ns/op
CompareBenchmark.compareTo  3450757314565799936  8935141660703064064  avgt    9  2.136 ± 0.421  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914816  avgt    9  2.168 ± 0.005  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386914817  avgt    9  2.935 ± 0.006  ns/op
CompareBenchmark.compareTo  3584865303386915816  3450757314565799936  avgt    9  4.596 ± 0.011  ns/op
CompareBenchmark.compareTo  3584865303386915816  3584865303386915816  avgt    9  1.375 ± 0.004  ns/op
CompareBenchmark.compareTo  3584865303386915816  8646911284551352320  avgt    9  2.288 ± 0.018  ns/op
CompareBenchmark.compareTo  3584865303386915816  8935141660703064064  avgt    9  1.973 ± 0.005  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914816  avgt    9  2.324 ± 0.100  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386914817  avgt    9  2.294 ± 0.023  ns/op
CompareBenchmark.compareTo  8646911284551352320  3450757314565799936  avgt    9  2.313 ± 0.038  ns/op
CompareBenchmark.compareTo  8646911284551352320  3584865303386915816  avgt    9  2.303 ± 0.039  ns/op
CompareBenchmark.compareTo  8646911284551352320  8646911284551352320  avgt    9  1.376 ± 0.001  ns/op
CompareBenchmark.compareTo  8646911284551352320  8935141660703064064  avgt    9  1.964 ± 0.004  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914816  avgt    9  1.973 ± 0.006  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386914817  avgt    9  1.974 ± 0.006  ns/op
CompareBenchmark.compareTo  8935141660703064064  3450757314565799936  avgt    9  1.976 ± 0.006  ns/op
CompareBenchmark.compareTo  8935141660703064064  3584865303386915816  avgt    9  1.973 ± 0.004  ns/op
CompareBenchmark.compareTo  8935141660703064064  8646911284551352320  avgt    9  1.963 ± 0.003  ns/op
CompareBenchmark.compareTo  8935141660703064064  8935141660703064064  avgt    9  1.375 ± 0.002  ns/op

1. CASE 2 moved to be tested first
2. CASE 1 & 3 tested only for numbers that have steering bits
3. CASE 4 refactored to fast passing for non-zero values
4. CASE 5 refactored to remove redundant comparison
@agdavydov81
Copy link
Copy Markdown

Hi!
The comparison speedup is great news!
Unfortunately, right now I can't review your pull request, but I promise to back in couple days.
In any way thank you very much!

@plokhotnyuk
Copy link
Copy Markdown
Author

plokhotnyuk commented Jul 6, 2023

Please, for yet more efficient comparison of finite numbers replace:

        // OPPOSITE SIGN (CASE5)
        // now, if the sign bits differ, x is greater if y is negative
        if (x_mask_sign ^ y_mask_sign) {
            return y_mask_sign ? 1 : -1;
        }
        // REDUNDANT REPRESENTATIONS (CASE6)
        // if both components are either bigger or smaller,
        // it is clear what needs to be done
        final int exp_diff = exp_x - exp_y;
        final long sig_diff = sig_x - sig_y;
        // if |exp_x - exp_y| < 15, it comes down to the compensated significand
        if (exp_diff > 0) {
            if (exp_diff > 15 || sig_diff > 0) {
                return x_mask_sign ? -1 : 1;
            }
            // otherwise adjust the x significand upwards
            // __mul_64x64_to_128MACH (sig_n_prime, sig_x, bid_mult_factor[exp_x - exp_y]); // @AD: Note: The __mul_64x64_to_128MACH macro is the same as __mul_64x64_to_128
            final long __CY = bid_mult_factor[exp_diff];
            final long sig_n_prime_w1 = Mul64Impl.unsignedMultiplyHigh(sig_x, __CY);
            final long sig_n_prime_w0 = sig_x * __CY;
            // if values are equal
            if (sig_n_prime_w1 == 0 && sig_n_prime_w0 == sig_y) {
                return 0;
            }
            // if positive, return whichever significand abs is smaller
            // (converse if negative)
            return (sig_n_prime_w1 == 0 && UnsignedLong.isLess(sig_n_prime_w0, sig_y)) ^ !x_mask_sign ? 1 : -1; // @AD: TODO: Check this case carefully
        }
        if (exp_diff < -15 || sig_diff < 0) {
            return x_mask_sign ? 1 : -1;
        } else if (exp_diff == 0 && sig_diff > 0) {
            return x_mask_sign ? -1 : 1;
        }
        // adjust the y significand upwards
        // __mul_64x64_to_128MACH (sig_n_prime, sig_y, bid_mult_factor[exp_y - exp_x]); // @AD: Note: The __mul_64x64_to_128MACH macro is the same as __mul_64x64_to_128
        final long __CY = bid_mult_factor[-exp_diff];
        final long sig_n_prime_w1 = Mul64Impl.unsignedMultiplyHigh(sig_y, __CY);
        final long sig_n_prime_w0 = sig_y * __CY;
        // if values are equal
        if (sig_n_prime_w1 == 0 && sig_n_prime_w0 == sig_x) {
            return 0;
        }
        // if positive, return whichever significand abs is smaller
        // (converse if negative)
        return (sig_n_prime_w1 != 0 || UnsignedLong.isLess(sig_x, sig_n_prime_w0)) ^ !x_mask_sign ? 1 : -1;  // @AD: TODO: Check this case carefully

by

        // OPPOSITE SIGN (CASE5) & REDUNDANT REPRESENTATIONS (CASE6)
        // if the sign bits differ, x is greater if y is negative
        // if both components are either bigger or smaller it is clear what needs to be done
        int cmp = 1;
        if (x_mask_sign == y_mask_sign) {
            final int exp_diff = exp_x - exp_y;
            final long sig_diff = sig_x - sig_y;
            if (exp_diff == 0) {
                cmp = Long.signum(sig_diff);
            } else if (exp_diff > 0) {
                if (exp_diff <= 15 && sig_diff <= 0) {
                    final long __CY = bid_mult_factor[exp_diff];
                    if (Mul64Impl.multiplyHigh(sig_x, __CY) == 0) {
                        cmp = Long.compareUnsigned(sig_x * __CY, sig_y);
                    }
                }
            } else {
                cmp = -1;
                if (exp_diff >= -15 && sig_diff >= 0) {
                    final long __CY = bid_mult_factor[-exp_diff];
                    if (Mul64Impl.multiplyHigh(sig_y, __CY) == 0) {
                        cmp = Long.compareUnsigned(sig_x, sig_y * __CY);
                    }
                }
            }
        }
        return x_mask_sign ? -cmp : cmp;

@plokhotnyuk
Copy link
Copy Markdown
Author

@agdavydov81 Have you had any chance to review this PR closely?

@agdavydov81
Copy link
Copy Markdown

Greatly sorry for delay.
I promise I will definitely review this PR tomorrow.

@agdavydov81
Copy link
Copy Markdown

I'm wondering: why do you invert some ternary operators? Is it just for looks or performance?

@agdavydov81 agdavydov81 merged commit 8558038 into epam:master Jul 27, 2023
@plokhotnyuk plokhotnyuk deleted the patch-1 branch July 27, 2023 17:39
@agdavydov81
Copy link
Copy Markdown

agdavydov81 commented Jul 27, 2023

@plokhotnyuk Great work! Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants