go - 生成 n 个不是 ∞ 或 NaN 的不同 float (在 Go 中)

标签 go floating-point type-conversion nan infinity

我想要一个函数 getNthFloat(uint32 n) float32 这样对于每个 n,m < 2³²-4 且 n≠m,getNthFloat(n)getNthFloat(m) 返回实数的不同 float (既不是 NaN 也不是 ±∞)。选择 2³²-4 是因为如果我理解 IEEE 754正确地,NaN 有两种二进制表示,一种表示∞,一种表示-∞。

我想我应该将我的 uint32 转换为位并将位转换为 float32,但我不知道如何有效地避免这四个值。

最佳答案

你不能在 float32 中得到 2^32-4 个有效的 float 。 IEEE 754 binary32 数字有两个无穷大(负和正)和 2^24-2 可能的 NaN 值。

一个 32 位 float 有以下几位:

31   30...23  22...0
sign exponent mantissa

所有值为 0xff 的指数要么是无穷大(当尾数为 0 时)要么是 NaN(当尾数不为 0 时)。所以你不能生成那些指数。

那么这只是一件简单的事情,或者将您允许的整数映射到这种格式,然后使用 math.Float32frombits 生成一个 float32。你如何做到这一点是你的选择。我可能会偷懒,只使用最低位作为符号,然后拒绝所有高于 2^32 - 2^24 - 1 的数字,然后移动这些位。

所以像这样(未经测试):

func foo(n uint32) float32 {
    if n >= 0xff000000 {
        panic("xxx")
    }
    return math.Float32frombits((n & 1) << 31 | (n >> 1))
}

注意我可能还会避免使用非正规数,即指数为 0 且尾数非零的数字。它们可能很慢并且可能无法正确处理。例如,它们都可以映射到零,go 规范中没有任何内容讨论如何处理非正规数字,所以我会小心。

关于go - 生成 n 个不是 ∞ 或 NaN 的不同 float (在 Go 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38266996/

相关文章:

go - 从另一个文件访问在 main func 中创建的运行时配置实例

Golang如何将字符串 slice 转换为字符串?

git - Go mod 用私有(private) fork 替换依赖

functional-programming - 方案:仅使用 R6RS,如何确定浮数的尾数和指数

c - 我们可以找到另一个小于float的数据类型吗?

c - 重新映射函数指针

python - 为什么 NumPy 对数组和标量返回不同的类型?

go - 在 Go AST 中如何表示 nil?

c - 注意 : expected ‘float (*)[100]’ but argument is of type ‘float (*)[100][100]’

java.util.Collections$UnmodifiableRandomAccessList 到 Collections.singletonList