Calculate logarithm for Decimal128 values. For integer bases >= 2 with zero scale, return an exact integer log when the value is a perfect power of the base. Otherwise falls back to f64 computation.
(value: i128, scale: i8, base: f64)
| 146 | /// For integer bases >= 2 with zero scale, return an exact integer log when the |
| 147 | /// value is a perfect power of the base. Otherwise falls back to f64 computation. |
| 148 | fn log_decimal128(value: i128, scale: i8, base: f64) -> Result<f64, ArrowError> { |
| 149 | if scale == 0 |
| 150 | && is_valid_integer_base(base) |
| 151 | && let Ok(unscaled) = u128::try_from(value) |
| 152 | && unscaled > 0 |
| 153 | { |
| 154 | let base_u128 = base as u128; |
| 155 | let int_log = unscaled.ilog(base_u128); |
| 156 | if base_u128.checked_pow(int_log) == Some(unscaled) { |
| 157 | return Ok(int_log as f64); |
| 158 | } |
| 159 | } |
| 160 | decimal_to_f64(value, scale).map(|v| v.log(base)) |
| 161 | } |
| 162 | |
| 163 | /// Convert a scaled decimal value to f64. |
| 164 | #[inline] |
searching dependent graphs…