4

符号情報が失われないように浮動小数点をシリアル化したい。具体的には、IEEE-754 負のゼロと通常のゼロを区別したいと思います。

言語仕様によると

ゼロによる浮動小数点除算の結果は、IEEE-754 標準を超えて指定されていません。実行時パニックが発生するかどうかは実装固有です。

それは私ができないことを示唆しています

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

そして私は試してmath.Copysignみましたmath.Signbit

func Signbit(x float64) bool

Signbittruex が負または負のゼロの場合に返します。

しかし

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

うまくいかないようです

n := -float64(0)

何か案は?

編集:

問題 2196を提出して、混乱を招く違いと思われるものを追跡しました

nz := -float64(0)

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

peterSO によって提案されたように。

4

2 に答える 2

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 に答える
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 に答える