2017-01-24 2 views
4

Я просто наткнулся на the Pow implementation in golang:Странная реализация пау в golang

func Pow(x, y float64) float64 { 
    // ... 
    case x == 0: 
     switch { 
     case y < 0: 
      if isOddInt(y) { 
       return Copysign(Inf(1), x) 
      } 
      return Inf(1) 
     case y > 0: 
      if isOddInt(y) { 
       return x 
      } 
      return 0 
     } 
    //... 
} 

не Является case y > 0 частью более сложным? Я бы просто вернулся 0. Или я что-то пропустил?

ответ

4

Существует два типа ноль, +0 и -0. возвращаемое значение Pow(-0,1) должно быть -0 не +0

создать -0 в golang, используйте math.Copysign.

x := math.Copysign(0, -1) 
if x == 0 { 
    fmt.Println("x is zero") 
} 
fmt.Println("x ** 3 is", math.Pow(x, 3)) 

выход выше кода

x is zero 
x ** 3 is -0 

вы можете проверить его в Go Playground

почему мы должны различать +0 и -0 см: https://softwareengineering.stackexchange.com/questions/280648/why-is-negative-zero-important

1

Ответ в эксплуатационной документации для функции, в случае случае y > 0 то выход функции выглядит следующим образом:

Pow(±0, y) = ±0 for y an odd integer > 0 
Pow(±0, y) = +0 for finite y > 0 and not an odd integer 

поэтому функция будет возвращать только 0(+0), как вы говорите, в том случае, x=0

Смежные вопросы