2011-08-28 102 views
4

我想序列化一個浮點,使符號信息不會丟失。具體而言,我想區分IEEE-754負零與常規零。區分零的符號:-float64(0)from go中的float64(0)

language spec的說

由零浮點除法的結果不超過IEEE-754標準規定的;是否發生運行時恐慌是特定於實現的。

這表明,我不能做

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

,我試圖math.Copysignmath.Signbit它說

func Signbit(x float64) bool 

Signbit回報true如果x爲負值或負零。

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

似乎並不爲

n := -float64(0) 

任何工作思路?

編輯:

我申請issue 2196跟蹤我認爲是

nz := -float64(0) 

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

之間的混亂差異由peterSO的建議。

回答

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 
+0

謝謝,我想我明白了。這個符號在'-float64(0)'中丟失了,但是當你執行顯式的額外操作時不會。 –

3

我無法獲得去操場(http://golang.org/doc/play/)生成從字面上在源代碼中輸入-0;我推測,編譯器將其轉換爲0。

不過,我可能會產生1-0這樣的:

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

打印:

0 
0 
true 
-0 
+0

人們可能會懷疑單元是否測試了atan2哪個測試的結果是-0是否按照作者的意圖工作? – Will

+0

啊,所以我在測試中沒能正確生成一個真正的-0值。 –