MCPcopy Create free account
hub / github.com/apache/arrow / Mod

Function Mod

cpp/src/gandiva/precompiled/decimal_ops.cc:395–426  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

393}
394
395BasicDecimal128 Mod(int64_t context, const BasicDecimalScalar128& x,
396 const BasicDecimalScalar128& y, int32_t out_precision,
397 int32_t out_scale, bool* overflow) {
398 if (y.value() == 0) {
399 const char* err_msg = "divide by zero error";
400 gdv_fn_context_set_error_msg(context, err_msg);
401 return 0;
402 }
403
404 // Adjust x and y to the same scale (higher one), and then, do a integer mod.
405 *overflow = false;
406 BasicDecimal128 result;
407 int32_t min_lz = MinLeadingZeros(x, y);
408 if (min_lz >= 2) {
409 auto higher_scale = std::max(x.scale(), y.scale());
410 auto x_scaled = CheckAndIncreaseScale(x.value(), higher_scale - x.scale());
411 auto y_scaled = CheckAndIncreaseScale(y.value(), higher_scale - y.scale());
412 result = x_scaled % y_scaled;
413 DCHECK_LE(BasicDecimal128::Abs(result), BasicDecimal128::GetMaxValue());
414 } else {
415 int64_t result_high;
416 uint64_t result_low;
417
418 gdv_xlarge_mod(x.value().high_bits(), x.value().low_bits(), x.scale(),
419 y.value().high_bits(), y.value().low_bits(), y.scale(), &result_high,
420 &result_low);
421 result = BasicDecimal128(result_high, result_low);
422 }
423 DCHECK(BasicDecimal128::Abs(result) <= BasicDecimal128::Abs(x.value()) ||
424 BasicDecimal128::Abs(result) <= BasicDecimal128::Abs(y.value()));
425 return result;
426}
427
428int32_t CompareSameScale(const BasicDecimal128& x, const BasicDecimal128& y) {
429 if (x == y) {

Callers 3

VerifyMethod · 0.85
TEST_FFunction · 0.85

Calls 9

MinLeadingZerosFunction · 0.85
CheckAndIncreaseScaleFunction · 0.85
GetMaxValueFunction · 0.85
gdv_xlarge_modFunction · 0.85
BasicDecimal128Function · 0.85
AbsFunction · 0.50
valueMethod · 0.45
scaleMethod · 0.45

Tested by 2

VerifyMethod · 0.68
TEST_FFunction · 0.68