【问题标题】:Easiest way to get the machine epsilon in Go在 Go 中获取机器 epsilon 的最简单方法
【发布时间】:2014-04-06 19:05:51
【问题描述】:

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

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

我想知道的一个原因是验证我是否已达到机器可以执行的给定计算的最大精度,这样我就不会过早退出或尝试超过需要的时间。

另一个只是为了好奇。

谢谢

编辑:

为了好玩,我在学校的一些笔记中查阅了有关如何手动计算 epsilon 的乐趣,这里是来自 c++ http://play.golang.org/p/XOXwIdNfsa享受的粗略翻译

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

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

【问题讨论】:

  • 很高兴看到您的代码与 7/3-4/3-1 相同:)

标签: floating-point go


【解决方案1】:

以上适用于任何二进制浮点类型(例如您所指的 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 中实现。 p>

【讨论】:

  • 你知道这个公式是从哪里得到的吗?或者为什么有效?
  • (7/3) - (4/3) 是 (3/3) 通过无法正确表示的“奇怪”浮点数获得的...... -1 应该给我们带来差异。 ..我猜?
  • 好的,请看这里的问题3:rstudio-pubs-static.s3.amazonaws.com/…
  • 但在回答您的第二条评论时,是的,我认为是的。不过也有一些例外,我无法让它与本机 Python 3.6 浮点数(不是 numpy)一起使用,因为似乎有一些自动舍入来纠正这种确切类型的浮点怪异。没有时间查找相关的 Python 文档进行检查。
【解决方案2】:

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

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

如果需要,建议似乎是使用math.Nextafter 来导出值。

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

【讨论】:

  • 使用epsilon := math.Nextafter(1, 2) - 1Playground
猜你喜欢
  • 2012-03-11
  • 2019-03-12
  • 1970-01-01
  • 2015-05-21
  • 2013-03-18
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多