最简单的方法来获取机器epsilon go(golang)

时间:2014-03-04 23:46:59

标签: floating-point go

在Go(golang)中获取机器epsilon的最简单方法是什么?那么浮点数的其他方面如精度,最小指数,最大指数,摆动等等呢?

我意识到math / const包中包含不同浮点类型(http://golang.org/src/pkg/math/const.go)的最大值和最小值,但没有其他信息。

我想知道的一个原因是验证我已达到机器可以执行的给定计算的最大精度,以便我不会提前退出或尝试更长时间。

另一个只是出于好奇。

由于

编辑:

为了好玩,我在学校的一些笔记中查看了如何手动为谜语计算epsilon,这是c ++ http://play.golang.org/p/XOXwIdNfsa享受的粗略翻译

编辑: 来自下面的评论(感谢找到epsilon的更惯用的方式):

使用epsilon := math.Nextafter(1, 2) - 1 Playground - Nick Craig-Wood 3月5日8:07

2 个答案:

答案 0 :(得分:9)

没有定义,我发现问题在问题跟踪器上解决为“按预期工作”:

https://code.google.com/p/go/issues/detail?id=966

如果您需要,建议似乎是使用math.Nextafter来获取值。

具体来说,公式为math.Nextafter(1.0,2.0)-1.0(第二个参数可以是大于1.0的任何数字)。

答案 1 :(得分:1)

Equation to use

以上适用于 任何二进制浮点类型(例如您所指的Go类型。)

package main

import "fmt"

func main() {
    f32 := float32(7.)/3 - float32(4.)/3 - float32(1.)
    fmt.Println(f32)

    f64 := float64(7.)/3 - float64(4.)/3 - float64(1.)
    fmt.Println(f64)
}

给出:

-1.1920929e-07
2.220446049250313e-16

取f32的绝对(无符号)值会产生正确的机器ε。

编辑:如下面SGJ的评论所述,这对十进制浮点类型不起作用,但据我所知,它们尚未在Golang中实现。