【问题标题】:Make a floating point number from a binary string in C++从 C++ 中的二进制字符串生成浮点数
【发布时间】:2016-08-23 16:34:11
【问题描述】:

我想取一个 32 位的随机字符串,并将这个位字符串声明为 C++ 中的浮点数。

例如字符串 0.0111 1111.1000 0000 0000 0000 0000 000 应该给我对应于 1.5 的浮点数,因为这是根据 IEEE 754-2008 对 1.5 的 F32 定义。第一个 0 表示 +ve,接下来的 8 给你一个 127-127 = 0 的指数,23 位尾数给你.5

如果字符串不是一个好的数据格式,那么我很乐意听取建议。

事实上,我想在 C++ 中创建一个随机浮点数,但我不知道如何。随机我的意思是每个位独立为 0 或 1。我发现的解决方案(例如:C++ random float number generation)建议使用随机整数生成器,然后除以 RAND_MAX,然后乘以 FLOAT_MAX 或根据某种均匀分布创建浮点数的其他方式。这对我没有好处,因为虽然值会均匀分布,但这会产生更多具有大指数的浮点数。

基本上是这个问题,但对于 C++:Convert Double to Binary representation?

【问题讨论】:

  • 如果您想要的只是一个随机浮点数,请参阅:stackoverflow.com/questions/686353/…
  • int32_t x = /* random value */; float f = *(float *) &x;。不是说这是一个好主意或不会违反任何规则。但这是可以做到的。
  • std::bitset,也许吧?此外,您似乎在问两个完全不同的问题。你能澄清一下吗?
  • 您需要解释更多关于该格式的信息,而不是简单地声明该字符串表示 1.5,因为连接是什么并不明显。
  • 如果要生成随机浮点值,请查看例如this reference of the standard pseudo-random generation facilities in C++.

标签: c++ floating-point


【解决方案1】:

如果您只想要一个能够产生指数分布的浮点数的 RNG,则不必担心二进制表示。只需使用数学即可。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <math.h>

int main (void) {
    int i;

    srand (time(NULL));

    // Make 10 'random' floats
    for (i = 0; i < 10; ++i)
    {
        // Float exponents go from -128 to 127
        float exponent = -128 + 256 * (float) rand() / RAND_MAX;

        float result = pow(2, exponent);

        printf ("%g\n", result);
    }

    return 0;
}

如果你想任意生成解释为浮点数的字节,你可以这样做...

int i = rand();
float result = *((float *)&i);

printf ("%g\n", result);

【讨论】:

  • 我担心这可能存在问题,这意味着它不会完全随机。例如,如果您对一个十进制数进行平方,则它的最后一位不能是 2、3 或 7(因为平方的最低位完全由输入的最低位决定)。我知道这不适用于这里可能有类似的东西。特别是在我的盒子上rand() 给出了一个 31 位整数,因此与 2^32 个不同的 F32 数字相比,该函数最多有 2^31 个输出(尽管其中 2^23 个代表 NaN)。
  • 我用一个代码 sn-p 更新了我的答案,它只获取 int 的字节并将其推入 float。怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2016-01-03
  • 2018-03-08
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多