````// Copyright 2009 The Go Authors. All rights reserved.`
`// Use of this source code is governed by a BSD-style`
`// license that can be found in the LICENSE file.`

`package math`

`// Ldexp is the inverse of Frexp.`
`// It returns frac × 2**exp.`
`//`
`// Special cases are:`
`//`
`//	Ldexp(±0, exp) = ±0`
`//	Ldexp(±Inf, exp) = ±Inf`
`//	Ldexp(NaN, exp) = NaN`
`func Ldexp(frac float64, exp int) float64 {`
`	if haveArchLdexp {`
`		return archLdexp(frac, exp)`
`	}`
`	return ldexp(frac, exp)`
`}`

`func ldexp(frac float64, exp int) float64 {`
`	// special cases`
`	switch {`
`	case frac == 0:`
`		return frac // correctly return -0`
`	case IsInf(frac, 0) || IsNaN(frac):`
`		return frac`
`	}`
`	frac, e := normalize(frac)`
`	exp += e`
`	x := Float64bits(frac)`
`	exp += int(x>>shift)&mask - bias`
`	if exp < -1075 {`
`		return Copysign(0, frac) // underflow`
`	}`
`	if exp > 1023 { // overflow`
`		if frac < 0 {`
`			return Inf(-1)`
`		}`
`		return Inf(1)`
`	}`
`	var m float64 = 1`
`	if exp < -1022 { // denormal`
`		exp += 53`
`		m = 1.0 / (1 << 53) // 2**-53`
`	}`
`	x &^= mask << shift`
`	x |= uint64(exp+bias) << shift`
`	return m * Float64frombits(x)`
`}`
```