区分零的符号:-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

相关文章

Css3如何实现鼠标移上变长特效?(图文+视频)
css3怎么实现鼠标悬停图片时缓慢变大效果?(图文+视频)
jquery如何实现点击网页回到顶部效果?(图文+视频)
css3边框阴影效果怎么做?(图文+视频)
css怎么实现圆角边框和圆形效果?(图文+视频教程)
Css3如何实现旋转移动动画特效