// Copyright 2009 The Go Authors. All rights reserved.
// Adapted from Go 1.24.0 src/math/pow.go for finite base-10 fractional powers.
// Redistribution terms are in licenses/GO-BSD-3-Clause.txt.

///|
fn format_power(precision : Double) -> Double {
  // Preserve the existing integral-precision path. Larger magnitudes already
  // underflow/overflow and are rejected by the formatting arithmetic checks.
  if precision == precision.floor() || precision.abs() > 324 {
    return @math.pow(10, precision)
  }
  if precision == 0.5 {
    return 10.0.sqrt()
  }
  if precision == -0.5 {
    return 1 / 10.0.sqrt()
  }
  let mut integral = precision.abs().floor().to_int()
  let mut fraction = precision.abs() - integral.to_double()
  if fraction > 0.5 {
    fraction -= 1
    integral += 1
  }
  let mut result = if @number.reference_amd64() {
    reference_exp(fraction * reference_log(10))
  } else {
    @math.exp(fraction * @math.ln(10))
  }
  let mut exponent = 0
  let mut factor = 0.625
  let mut factor_exponent = 4
  while integral != 0 {
    if (integral & 1) != 0 {
      result *= factor
      exponent += factor_exponent
    }
    factor *= factor
    factor_exponent *= 2
    if factor < 0.5 {
      factor *= 2
      factor_exponent -= 1
    }
    integral = integral >> 1
  }
  if precision < 0 {
    result = 1 / result
    exponent = -exponent
  }
  @math.scalbn(result, exponent)
}