bigfloat
bigfloat copied to clipboard
Pow(Inf, -1) == 0 not Inf. True for all negative exponents
Hi again, this one is more of an edge case... But for consistency with math.Pow()
Also, for -Inf
: Pow(-Inf, -1) == -0
, but this also doesn't work because of #35
Thanks again!
package main
import (
"fmt"
"math"
"math/big"
"github.com/ALTree/bigfloat"
)
func main() {
// Exponentiation of Inf^n equals 0 for all negative n
// e.g. Inf^-2 = 0
zero := math.Pow(math.Inf(1), -2)
fmt.Printf("%f\n", zero) // 0.000000
bigneg2 := big.NewFloat(-2)
bigInf := big.NewFloat(0.0).SetInf(false)
bigzero := bigfloat.Pow(bigInf, bigneg2)
fmt.Printf("%f\n", bigzero) // +Inf != 0.000000
}
Repro for second case of -Inf:
package main
import (
"fmt"
"math"
"math/big"
"github.com/ALTree/bigfloat"
)
func main() {
// Exponentiation of -Inf^n equals -0 for all odd negative integer n
// e.g. -Inf^-1 = -0
// Exponentiation of -Inf^n equals 0 for all even negative integer n
// e.g. -Inf^-2 = 0
zero := math.Pow(math.Inf(-1), -1)
fmt.Printf("%f\n", zero) // 0.000000
fmt.Printf("%t\n", math.Signbit(zero)) // true == negative zero
zero = math.Pow(math.Inf(-1), -2)
fmt.Printf("%f\n", zero) // 0.000000
fmt.Printf("%t\n", math.Signbit(zero)) // false == positive zero
bigneg1 := big.NewFloat(-1)
bignegInf := big.NewFloat(0.0).SetInf(true)
bignegzero := bigfloat.Pow(bignegInf, bigneg1) // PANIC!
fmt.Printf("%f\n", bignegzero) // Should be -0.000000
fmt.Printf("%t\n", bignegzero.Signbit()) // Should be true
bigneg2 := big.NewFloat(-2)
bigzero := bigfloat.Pow(bignegInf, bigneg2) // PANIC!
fmt.Printf("%f\n", bigzero) // Should be 0.000000
fmt.Printf("%t\n", bigzero.Signbit()) // Should be false
}
See https://github.com/ALTree/bigfloat/pull/37