Skip to content

Goで絶対値を取るときのベストプラクティス

This content is a draft and will not be included in production builds.

golang-nutsでmath.Abs vs if value < 0というスレッドがあった。これによると、

if v < 0.0 {
return -v
}
return v

上記のコードでは -0.0 に対応できない点と、パフォーマンスの面でもCPU上で分岐が発生するので、math.Abs を使うほうが早いんじゃないかとのことだった。src/math/abs.goの実装をみると単にビットを落としているだけで、確かに分岐はない。

Float64frombits(Float64bits(x) &^ (1 << 63))

整数の場合は max を使うのがいいと思うが、math.MinInt32 ではどうなるのか。どういうわけかマイナスの最小値が取れる。

func abs(v int32) int32 {
return max(v, -v)
}
func main() {
fmt.Println(abs(math.MinInt32)) // -2147483648
}