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

时间:2011-08-28 21:37:24

标签: go ieee-754 zero

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

language spec

  

除了IEEE-754标准之外,没有规定浮点除零的结果;是否发生运行时恐慌是特定于实现的。

这表明我做不到

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

我尝试了math.Copysignmath.Signbit,其中包含

func Signbit(x float64) bool
     如果x为负数或负零,则

Signbit会返回true

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

似乎不适用于

n := -float64(0)

有什么想法吗?

编辑:

我提交issue 2196来跟踪我认为

之间令人困惑的区别
nz := -float64(0)

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

如peterSO所建议。

2 个答案:

答案 0 :(得分:3)

我无法让go操场(http://golang.org/doc/play/)从字面上输入来源生成-0;我推测编译器将其转换为0。

但是,我可以像这样生成-0:

fmt.Println(0);
fmt.Println(-0);
hmm := -1 / math.Inf(1);
fmt.Println(math.Signbit(hmm));
fmt.Println(hmm);

打印:

0
0
true
-0

答案 1 :(得分:3)

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