【问题标题】:Negative zero literal in golanggolang中的负零文字
【发布时间】:2014-12-18 03:00:12
【问题描述】:

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

a  := -0.0
fmt.Println(a, 1/a)

输出

0 +Inf

我预期的地方

-0 -Inf

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

Java:

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

C#:

var a = -0d;
Console.WriteLine(1/a); // outputs "-Infinity"

Javascript:

​var a = -0;
console.log(a, 1/a);​ // logs "0 -Infinity"

但我在 Go 中找不到等价物。

你如何在 go 中写一个负零字面量?

【问题讨论】:

  • 你试过a := 0.0; a *= -1.0吗?
  • 不,我只测试了a := 0.0 * -1.0。您的代码有效,如果没有更好的解决方案,我将使用。但这并不是我所说的文字。
  • 是的,不是文字。我不懂golang,所以就想用这种方式检查一下它是否支持普通操作的负零。
  • 你是否提交了一个针对 go 的错误?
  • @StephenCanon 我会在填充之前询问 golang-nuts。但实际上这不是必需的:已经有一个已注册的问题(请参阅下面的我的“答案”)。

标签: math floating-point go ieee-754


【解决方案1】:

a registered issue

它恰好给出了一种解决方案:

a := math.Copysign(0, -1)

还不错,因为它显然是指IEEE754定义的标准copysign函数。

但这意味着您需要导入一个包,而这对于(不可否认的次要和罕见的)需求来说仍然显得过于繁重。

【讨论】:

  • W/o 导入“数学”:play.golang.org/p/iymSJElses(我相信它是内联的)
  • 不幸的是,这似乎是指定的语言行为(来自问题页面上的讨论),因为它明显违反了 IEEE-754 (5.12.1)“从支持的格式到外部字符的转换恢复原始浮点表示的序列[包括源语言文字]和返回,应恢复零、无穷大和安静的 NaN,以及非零有限数。特别是零和无穷大的符号被保留。"
【解决方案2】:
package main

import (
        "fmt"
        "math"
)

func main() {
        a := 1. / math.Inf(-1)
        fmt.Println(a, 1/a)
}

(也叫here


输出:

-0 -Inf

【讨论】:

  • 好的。它回答(​​因此+1)。但是说真的,为什么不像其他语言那样a := -0.0 呢?这是一个错误还是一个“功能”?
  • 数学上 -0 和 0 是相等的,所以我猜 Go 做了正确的事情。 0 的符号是,AFAIK,只是下溢的结果,而不是来自一元减号(如 -1*0)。
  • 它们“相等”,因为 -0==0 应该是真的,但是在其他语言中(我刚刚在 Javascript 和 Java 中测试过),将 1 除以 -0 或 +0 会得到 -Infinity或+无穷大。这可能很重要。
  • 请不要与Javascript比较。 JS 以在数学上犯很多错误而闻名。
  • @jnml - +0 == -0 并不完全正确,因为“−0”可能表示已舍入为零的小负数。 en.wikipedia.org/wiki/Signed_zero。请注意,Go 声称可以正确处理 IEEE-754,这是它的要求之一。
【解决方案3】:

我刚试过这个,它似乎对我有用。

package main

import (
    "fmt"
    )

func main() {
    zero := float64(0)
    neg_zero := -zero
    fmt.Println(zero, neg_zero)
}

虽然当我做neg_zer0 := - float64(0)时它没有按预期工作

【讨论】:

  • 这相当于我收到的第一条评论(来自 Daniel Fischer)。这不是字面意思。
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 2016-08-25
  • 2011-03-09
  • 2012-08-24
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多