我想要一个函数getNthFloat(uint32 n) float32
,使得对于每个n,m< 2 n = 4,n≠m,getNthFloat(n)
和getNthFloat(m)
返回实数不同的浮点数(NaN和±∞)。选择2³²-4是因为如果我正确理解IEEE 754,则有两个NaN的二进制表示,一个用于∞,一个用于-∞。
我想我应该将uint32转换为位并将位转换为float32,但我无法弄清楚如何有效地避免这四个值。
答案 0 :(得分:7)
你不能在float32中获得2 ^ 32-4个有效浮点数。 IEEE 754二进制32号具有两个无穷大(负和正)和2 ^ 24-2可能的NaN值。
32位浮点数具有以下位:
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))
}
N.B。我可能还会避免使用非正规数,即带有指数0和非零尾数的数字。它们可能很慢,可能无法正确处理。例如,它们都可以映射到零,在go规范中没有任何内容可以解释如何处理非规范数字,所以我要小心。
答案 1 :(得分:0)
我认为您正在寻找$result= Recursiver_of_Array($array, 'stripslashes');
功能:https://golang.org/pkg/math/#Float32frombits