【问题标题】:Minimum positive float64 value最小正 float64 值
【发布时间】:2020-08-03 16:21:45
【问题描述】:

就像This question 一样,我需要一个尽可能接近零的正数,而不是零,但在 Go 中。

【问题讨论】:

  • 嗯,我不认为这是 stackoverflow.com/a/22185792/1174966 的副本。 epsilon 是另一回事。
  • epsilon 与浮点数据类型的准确性(尾数中有多少位)有关,而您的问题与数字范围有关(什么是最小指数 + 逐渐下溢)。
  • 所谓的“epsilon”是从1到下一个更大的可表示数的距离。对于 IEEE-754 binary64,它是 2^-52。最小正可表示值是 0 之后的下一个更大的可表示数。对于 binary64,它是 2^-1074。这些是非常不同的数字,具有非常不同的目的,应该更改此问题的标题和正文,或者应将其标记为不同问题的副本,而不是回答有关 epsilon 的问题。
  • @kostix:我对 C++ 类型和 IEEE-754 binary64 here 的各种“最小值”有一个彻底的答案,但这个问题是关于 Go 的。数值当然是相同的,但是正确的答案/重复必须包括 Go 的 float64 使用 IEEE-754 binary64 的断言。有一个粗略的问答here

标签: go floating-point limit


【解决方案1】:

math 包有一个用于这个和类似值的常量,只需使用它:math.SmallestNonzeroFloat64

const (
    MaxFloat32             = 3.40282346638528859811704183484516925440e+38  // 2**127 * (2**24 - 1) / 2**23
    SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23)

    MaxFloat64             = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52
    SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
)

打印它的值:

fmt.Println(math.SmallestNonzeroFloat64)

输出(在Go Playground 上试用):

5e-324

(注意:由于fmt 包中的舍入,它大于常数。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2010-09-27
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多