gpt4 book ai didi

c - 从 float 的末尾随机取一点

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:27 25 4
gpt4 key购买 nike

我的程序中有一个 float ,它在每次迭代后都会发生变化,即 G[0]。我想使用尾数的最后一位作为“随机”位,我将使用它来选择计算中采用的路径。然而,我现在使用的计算总是打印出 0,而它应该大约是 50/50;我的错误是什么?函数签名定义了 float* G

unsigned rand_bit = *((unsigned *)&G[0])>>31;
printf("%i", rand_bit);

最佳答案

首先,*((unsigned *)&G[0]) 导致 undefined behaviour通过违反严格的别名规则。在标准 C 中,不允许通过使用不同类型访问一种类型的内存,少数特殊情况除外。

您可以通过在编译器中禁用严格别名,或使用 unionmemcpy 来解决此问题。

(您的代码还依赖于 unsignedfloat 大小相同,这通常不是真的)。​​


但是假设您确实解决了这些问题,那么您的代码正在测试最重要的位。在IEEE 32-bit floating point format ,那位是符号位。因此它将读取 0 表示正数,1 表示负数。

在将内存重新解释为整数后,尾数的最后一位将是最低有效位。

更正后的代码可能如下所示:

unsigned u;
assert( sizeof u == sizeof *G );
memcpy(&u, G, sizeof u);
printf("%u", u & 1);

注意。我会犹豫假设这个位是“随机的”,如果你想要一个随机分布的位,有更好的选择。

关于c - 从 float 的末尾随机取一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38317568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com