2011-08-28 4 views
4

부호 정보가 손실되지 않도록 부동 소수점을 직렬화하려고합니다. 특히 IEEE-754 음수 0과 일반 0을 구별하고 싶습니다.구분 기호 0 : float64 (0) from 이동

language spec는 IEEE-754 표준 이상으로 지정되지

0으로 부동 소수점 나눗셈의 결과를 말한다; 런타임 패닉이 발생하는지 여부는 구현에 따라 다릅니다. 내가

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) 

어떤 아이디어가 작동하지 않는 것 ?

편집 : peterSO에 의해 제안

는 내가 무슨 생각을 추적 할 issue 2196을 제기은

nz := -float64(0) 

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

사이에 혼란 차이입니다.

답변

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이 같은를 생성 할 수있는 컴파일러는 그러나 0

로 변환 추측 것

0 false -0 true 
n is negative zero: -0 
+0

고마워, 나는 이해한다고 생각해. 이 기호는'-float64 (0)'에서는 없어지지 만 명시 적으로 추가 작업을 수행 할 때는 사라집니다. –

3

말 그대로 입력 할 때 -0을 생성하기 위해 이동 영역 (http://golang.org/doc/play/)을 가져올 수 없습니다.

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

인쇄 :

0 
0 
true 
-0 
+0

-0에 대한 테스트 인 atan2에 대한 단위 테스트가 실제인지 궁금해 할 수 있습니다. 저자가 의도 한대로 일하는 것일까 요? – Will

+0

아, 그래서 진짜 0 값을 제대로 생성하기 위해 테스트에 실패했습니다. –