Потолочный функционал до go1.10 - PullRequest
0 голосов
/ 24 августа 2018

Мне требуется пользовательская функция 'Ceil', которая работает как в go1.10 и выше, так как мы находимся на v1.9 (obv не будет такой же производительной, но это нормально), например, Ceil(0.33) = 1.00

Я видел некоторыеОднако общие решения для округления ближайших int интересуются, если кто-нибудь реализовал эквивалентную функцию 'Ceil' для v1.9 в качестве обходного пути?

1 Ответ

0 голосов
/ 24 августа 2018

Поскольку Go имеет открытый исходный код, вы можете просто напрямую использовать их код: https://golang.org/src/math/floor.go?s=720:748#L26

Я изучил код и извлек все фрагменты в эту маленькую программу для вас:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fmt.Println(ceil(1.5))
    fmt.Println(ceil(0.5))
    fmt.Println(ceil(0.0))
    fmt.Println(ceil(-0.5))
    fmt.Println(ceil(-1.5))
}

func ceil(x float64) float64 {
    return -floor(-x)
}

func floor(x float64) float64 {
    if x == 0 || isNaN(x) || isInf(x, 0) {
        return x
    }
    if x < 0 {
        d, fract := modf(-x)
        if fract != 0.0 {
            d = d + 1
        }
        return -d
    }
    d, _ := modf(x)
    return d
}

func isNaN(f float64) (is bool) {
    return f != f
}

func isInf(f float64, sign int) bool {
    return sign >= 0 && f > maxFloat64 || sign <= 0 && f < -maxFloat64
}

func modf(f float64) (int float64, frac float64) {
    if f < 1 {
        switch {
        case f < 0:
            int, frac = modf(-f)
            return -int, -frac
        case f == 0:
            return f, f
        }
        return 0, f
    }

    x := float64bits(f)
    e := uint(x>>shift)&mask - bias

    if e < 64-12 {
        x &^= 1<<(64-12-e) - 1
    }
    int = float64frombits(x)
    frac = f - int
    return
}

const (
    maxFloat64 = 1.797693134862315708145274237317043567981e+308
    mask       = 0x7FF
    shift      = 64 - 11 - 1
    bias       = 1023
)

func float64bits(f float64) uint64 {
    return *(*uint64)(unsafe.Pointer(&f))
}

func float64frombits(b uint64) float64 {
    return *(*float64)(unsafe.Pointer(&b))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...