4

我想以不丢失符号信息的方式序列化浮点数。具体来说,我想将 IEEE-754 负零与常规零区分开来。

语言规范

浮点除以零的结果没有超出 IEEE-754 标准;是否发生运行时恐慌是特定于实现的。

这表明我做不到

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

我试过了math.Copysignmath.Signbit它说

func Signbit(x float64) bool

Signbittrue如果 x 为负数或负零,则返回。

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

似乎不起作用

n := -float64(0)

有任何想法吗?

编辑:

我提交了问题 2196来跟踪我认为两者之间令人困惑的区别

nz := -float64(0)

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

正如peterSO所建议的那样。

4

2 回答 2

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
于 2011-08-28T22:09:11.523 回答
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
于 2011-08-28T23:10:34.897 回答