微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

区分零的符号:-float64(0)与Go中的float64(0)

我希望以一种标志信息不会丢失的方式序列化浮点.具体来说,我想区分IEEE-754负零和常规零.

language spec

The result of a floating-point division by zero is not specified beyond the IEEE-754 standard; whether a run-time panic occurs is implementation-specific.

这表明我做不到

n == 0 && (float64(1) / n) < 0

我试过数学.copysign和math.Signbit

06001

Signbit returns true if x is negative or negative zero.

n == 0 && math.Signbit(n)

似乎不起作用

n := -float64(0)

有任何想法吗?

编辑:

我提交了issue 2196来追踪我认为之间令人困惑的区别

nz := -float64(0)

pz := float64(0)
nz := -pz

正如彼得斯所建议的那样.

解决方法

package main

import (
    "fmt"
    "math"
)

func main() {
    pz := float64(0)
    nz := -pz
    fmt.Println(pz,math.Signbit(pz),nz,math.Signbit(nz))
    if n := nz; n == 0 && math.Signbit(n) {
        fmt.Println("n is negative zero:",n)
    }
}

输出

0 false -0 true
n is negative zero: -0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。