golang中的负零字面值

Den*_*ret 9 math floating-point go ieee-754

IEEE754支持负零.但是这段代码

a  := -0.0
fmt.Println(a, 1/a)
Run Code Online (Sandbox Code Playgroud)

输出

0 +Inf
Run Code Online (Sandbox Code Playgroud)

我原以为预期的地方

-0 -Inf
Run Code Online (Sandbox Code Playgroud)

浮点格式基于IEEE754的其他语言允许您创建负零文字

Java:

float a = -0f;
System.out.printf("%f %f", a, 1/a); // outputs "-0,000000 -Infinity"
Run Code Online (Sandbox Code Playgroud)

C# :

var a = -0d;
Console.WriteLine(1/a); // outputs "-Infinity"
Run Code Online (Sandbox Code Playgroud)

Javascript:

?var a = -0;
console.log(a, 1/a);? // logs "0 -Infinity"
Run Code Online (Sandbox Code Playgroud)

但我在Go中找不到相同的东西.

你怎么写go负零文字?

Den*_*ret 9

一个注册问题.

它碰巧提供了一种解决方案:

a := math.Copysign(0, -1)
Run Code Online (Sandbox Code Playgroud)

它并没有那么糟糕,因为它显然是指copysign由定义的标准函数IEEE754.

但这意味着您需要导入一个包,这对于(无可否认的次要和罕见)需求来说仍然太重了.

  • 不幸的是,这似乎是指定的语言行为(来自问题页面上的讨论),因为它明显违反IEEE-754(5.12.1)"从支持格式到外部字符序列的转换[包括源语言文字]并且恢复原始浮点表示,将恢复零,无穷大和安静的NaN,以及非零有限数.**特别是,保留零和无穷大的符号.**" (7认同)

zzz*_*zzz 5

package main

import (
        "fmt"
        "math"
)

func main() {
        a := 1. / math.Inf(-1)
        fmt.Println(a, 1/a)
}
Run Code Online (Sandbox Code Playgroud)

(还在这里)


输出:

-0 -Inf
Run Code Online (Sandbox Code Playgroud)

  • @jnml - +0 == -0并不完全正确,因为"-0"可能表示已舍入为零的小负数.http://en.wikipedia.org/wiki/Signed_zero.请注意,Go声称可以正确处理IEEE-754,这是其要求之一. (3认同)