在Go语言中,如何区分-float64(0)和float64(0)的零标志?

4
我希望能够对浮点数进行序列化,使得符号信息不会丢失。具体来说,我想区分IEEE-754负零和普通零。 语言规范中提到:

除以零的浮点数结果在IEEE-754标准之外未指定;运行时是否发生崩溃是由实现特定的。

这表明我不能这样做。
n == 0 && (float64(1) / n) < 0

我尝试了math.Copysignmath.Signbit,它们的作用是

func Signbit(x float64) bool

Signbit returns true if x is negative or negative zero.

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

似乎无法工作于

n := -float64(0)

有什么想法吗?

编辑:

我提交了问题2196来跟踪我认为存在的一个令人困惑的差异。

nz := -float64(0)

并且

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

如PeterSO所建议。

2个回答

3

我无法在go playground(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

有人可能会想,对于测试 atan2 函数中是否包含对 -0 的单元测试,这些测试是否按照作者的意图正常工作呢? - Will
啊,所以我在测试中未能正确生成真正的-0值。 - Mike Samuel

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

谢谢,我想我明白了。在-float64(0)中符号丢失了,但当您执行显式的额外操作时不会。 - Mike Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接