在Go中获取机器epsilon的最简单方法

9
什么是在Go语言中获取机器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 Mar 5 at 8:07

意思是:在编程中,可以使用这个方法来计算最小的可表示数值。


很高兴看到你的代码得出了与7/3-4/3-1相同的结果 :) - Moustache
2个回答

15

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

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

建议是如果需要该值,则使用math.Nextafter进行推导。

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


6
使用epsilon := math.Nextafter(1, 2) - 1 Playground - Nick Craig-Wood

2

需要使用的方程式

上述内容适用于任何二进制浮点类型(例如您提到的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中实现。


2
{btsdaf} - sbditto85
1
(7/3)-(4/3)是通过“奇怪”的浮点数得到的(3/3),这些数字无法正确表示...应该给我们带来差异的是哪个-1呢?我猜? - sbditto85
当然,可以看这里的问题3:http://rstudio-pubs-static.s3.amazonaws.com/13303_daf1916bee714161ac78d3318de808a9.html - Moustache
请将以下与编程有关的内容从英语翻译成中文:Python Numpy 机器精度。仅返回已翻译的文本。 - Moustache
但是针对你的第二条评论,我认为是这样的。不过也有一些例外,我无法使用本地Python 3.6浮点数(而不是numpy)使其正常工作,因为似乎在底层存在一些自动舍入来纠正这种奇怪的浮点类型问题。我没有时间找到相关的Python文档来进行核对。 - Moustache
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接