gpt4 book ai didi

java - 为什么 Oracle 声称 java.util.Random.nextFloat() 生成 2^24 种可能性而不是 2^23 种?

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:13 27 4
gpt4 key购买 nike

根据 java.util.Random 的文档, Java类工具 nextFloat通过 next(24) / ((float)(1 << 24)) (即 24 位除以 224 的随机非负整数)。该文档声称可以返回所有 224 可能的值。它们介于 0(含)和 1(不含)之间。但是,我不认为这是真的。

首先,请注意,根据 IEC 559 (IEEE 754) 标准,float有 23 个小数位。但是有一个值为 1 的隐式前导位(在二进制小数点的左侧),除非指数存储为全零。因此,一共有 224 个类型为 float 的值。介于 0(包括 - 不包括负零)和 1(不包括负零)之间,但恰好有一半的数字是次正规的(指数中的所有位均为 0),这使得它们都小于 2-126 。因此,这些数字都不能由实现生成。这是因为它们都严格小于实现中使用的 2-24

float的布局可以在 Single-precision floating-point format 找到.

那么我缺少的是什么?

最佳答案

在区间 [+0, 1) 中,有 127•223 个值可以用 float 表示,而不是 224。从0到126(含)的指​​数编码字段的每一种组合都有一个,尾数编码字段中每个值23位。

m•2−24 形式的每个值,其中 0 ≤ m < 224,是可代表的。这种形式的最小非零值是 2−24,用指数代码 103 和有效数字代码 0 表示。数学指数是代码 103 减去偏差, 127,等于-24,有效数为1。

对于非零的任何这样的m,让b为其前导1位的位置编号(从0开始编号为低位)。然后m•2−24被编码为float,指数代码为b+103,尾数代码为b+103 m•224− b−224。对于 m = 0,它用全零位编码。

这种形式的数字都不是次正规的。

关于java - 为什么 Oracle 声称 java.util.Random.nextFloat() 生成 2^24 种可能性而不是 2^23 种?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059231/

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