区分零的符号:Go 中的 -float64(0) 与 float64(0)

发布于 2024-12-01 14:28:02 字数 1019 浏览 1 评论 0原文

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

语言规范

浮点除以零的结果未在 IEEE-754 标准之外指定;是否发生运行时恐慌是特定于实现的。

这表明我不能这样做

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

,我尝试了 math.Copysignmath.Signbit 上面写着

func Signbit(x float64) bool
如果 x 为负数或负零,

Signbit 返回 true

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

似乎不适用于

n := -float64(0)

任何想法?

编辑:

我提交了问题 2196 来跟踪我的想法 之间的令人困惑的区别。

nz := -float64(0)

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

peterSO 所建议的

I want to serialize a floating point in such a way that sign info is not lost. Specifically, I would like to distinguish IEEE-754 negative zero from regular zero.

The language spec says

The result of a floating-point division by zero is not specified beyond the IEEE-754 standard; whether a run-time panic occurs is implementation-specific.

which suggests that I cannot do

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

and I tried math.Copysign and math.Signbit which says

func Signbit(x float64) bool

Signbit returns true if x is negative or negative zero.

but

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

doesn't seem to work for

n := -float64(0)

Any ideas?

EDIT:

I filed issue 2196 to track what I think is a confusing difference between

nz := -float64(0)

and

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

as suggested by peterSO.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

得不到的就毁灭 2024-12-08 14:28:03
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
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)
    }
}

Output:

0 false -0 true
n is negative zero: -0
眼波传意 2024-12-08 14:28:03

我无法访问 go Playground ( 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

I couldn't get the go playground ( http://golang.org/doc/play/ ) to generate a -0 from literally typing it in source; I'd speculate the compiler converts it to 0.

However, I could generate a -0 like this:

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

Prints:

0
0
true
-0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文