我希望以一种标志信息不会丢失的方式序列化浮点。具体来说,我想区分IEEE-754负零和常规零。
除了IEEE-754标准之外,没有规定浮点除零的结果;是否发生运行时恐慌是特定于实现的。
这表明我做不到
n == 0 && (float64(1) / n) < 0
我尝试了math.Copysign
和math.Signbit
,其中包含
如果x为负数或负零,则func Signbit(x float64) bool
Signbit
会返回true
。
但
n == 0 && math.Signbit(n)
似乎不适用于
n := -float64(0)
有什么想法吗?
编辑:
我提交issue 2196来跟踪我认为
之间令人困惑的区别nz := -float64(0)
和
pz := float64(0)
nz := -pz
如peterSO所建议。
答案 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