///|
/// The base 10 logarithm of `x` (Float).
pub fn log10f(x : Float) -> Float {
  let mut x = x
  let ivln10hi : Float = 4.3432617188e-01 // 0x3ede6000 */
  let ivln10lo : Float = -3.1689971365e-05 // 0xb804ead9 */
  let log10_2hi : Float = 3.0102920532e-01 // 0x3e9a2080 */
  let log10_2lo : Float = 7.9034151668e-07 // 0x355427db */
  let lg1 : Float = 0.66666662693 // 0xaaaaaa.0p-24 */
  let lg2 : Float = 0.40000972152 // 0xccce13.0p-25 */
  let lg3 : Float = 0.28498786688 // 0x91e9ee.0p-25 */
  let lg4 : Float = 0.24279078841 // 0xf89e26.0p-26 */
  let mut ui : UInt = x.reinterpret_as_uint()
  let mut ix : UInt = ui
  let mut k : Int = 0
  if ix < 0x00800000 || ix >> 31 > 0 {
    // x < 2**-126  */
    if ix << 1 == 0 {
      return -recipf(x * x)
    } // log(+-0)=-inf */
    if ix >> 31 > 0 {
      return (x - x) / 0.0
    } // log(-#) = NaN */
    // subnormal number, scale up x */
    k -= 25
    x = x * (0x1.0p25 : Float)
    ui = x.reinterpret_as_uint()
    ix = ui
  } else if ix >= 0x7f800000 {
    return x
  } else if ix == 0x3f800000 {
    return 0.0
  }

  // reduce x into [sqrt(2)/2, sqrt(2)] */
  ix += 0x3f800000U - 0x3f3504f3U
  k += (ix >> 23).reinterpret_as_int() - 0x7f
  ix = (ix & 0x007fffff) + 0x3f3504f3
  ui = ix
  x = Float::reinterpret_from_uint(ui)
  let f = x - 1.0
  let s = f / (f + 2.0)
  let z = s * s
  let w = z * z
  let t1 = w * (lg2 + w * lg4)
  let t2 = z * (lg1 + w * lg3)
  let r = t2 + t1
  let hfsq = f * f * 0.5
  let hi = f - hfsq
  let ui = hi.reinterpret_as_uint() & 0xfffff000
  let hi = Float::reinterpret_from_uint(ui)
  let lo = f - hi - hfsq + s * (hfsq + r)
  let dk : Float = Float::from_int(k)
  dk * log10_2lo +
  (lo + hi) * ivln10lo +
  lo * ivln10hi +
  hi * ivln10hi +
  dk * log10_2hi
}