math.Dim în Go

math.Dim dă diferența pozitivă max(x-y, 0); math.Copysign copiază semnul; math.Signbit spune dacă un număr are semn minus.

Sintaxă
import "math"

func Dim(x, y float64) float64
func Copysign(f, sign float64) float64
func Signbit(x float64) bool

Ce face math.Dim

math.Dim(x, y) returnează x - y dacă este pozitivă, altfel 0. Este util pentru „cât lipsește” sau „cât depășește”: Dim(cheltuieli, buget) spune cu cât ai depășit bugetul, fără valori negative.

math.Copysign(f, sign) returnează valoarea lui f fără semn, dar cu semnul lui sign. Copysign(3, -1) este -3.

math.Signbit(x) returnează true dacă bitul de semn este setat, adică pentru numerele negative și pentru -0. Spre deosebire de x < 0, recunoaște și zero negativ.

Parametri

Parametru Descriere
x, y Pentru Dim: numerele scăzute.
f, sign Pentru Copysign: valoarea și numărul din care se ia semnul.

Ce returnează

Dim, Copysign: un float64. Signbit: un bool.

Exemple

Exemplul 1: Depășirea bugetului cu Dim

package main

import (
    "fmt"
    "math"
)

func main() {
    buget := 500.0
    for _, cheltuit := range []float64{420, 575.5} {
        fmt.Printf("Cheltuit %.2f lei, depășire: %.2f lei\n", cheltuit, math.Dim(cheltuit, buget))
    }
}

Rezultat

Cheltuit 420.00 lei, depășire: 0.00 lei
Cheltuit 575.50 lei, depășire: 75.50 lei

Exemplul 2: Copysign, Signbit și zero negativ

Zero negativ se obține cu Copysign(0, -1). Comparația < 0 nu îl deosebește de zero, dar Signbit da.

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.Copysign(3, -1))
    fmt.Println(math.Copysign(-2.5, 1))

    zeroNegativ := math.Copysign(0, -1)
    fmt.Println(zeroNegativ, zeroNegativ < 0, math.Signbit(zeroNegativ))
    fmt.Println(math.Signbit(-4), math.Signbit(4))
}

Rezultat

-3
2.5
-0 false true
true false

Greșeli frecvente

  • Scrii -0.0 în cod ca să obții zero negativ: constanta este evaluată exact și dă zero pozitiv. Folosește math.Copysign(0, -1).

Comenzi înrudite

  • math.Abs: Returnează valoarea absolută (modulul) unui număr float64: distanța lui față de zero, fără semn.
  • math.Max: math.Max returnează cel mai mare, iar math.Min cel mai mic dintre două numere float64.