我想生成包含次正规浮点数的浮点数。我们是否可以使用rand()
的例程math.h
来实现此目标编程语言应为C99
。我希望这个随机数从[-1e308到1e308]均匀分布。
答案 0 :(得分:1)
写入联合的一个字段并从另一个字段读取通常会遇到麻烦,但以下在许多系统上运行良好:
这将生成非数字。 NAN
double random_double(void) {
union {
unsigned char uc[sizeof (double)];
double d;
} u;
unsigned i;
for (i=0; i<sizeof u.uc; i++) {
u.uc[i] = rand();
}
return u.d;
}
一种不返回NAN的方法。另请参阅IEEE 754 specifies an isNaN() predicate which does not raise an exception even when used with signaling NaN
double rand_double_NotNAN(void) {
union {
double d;
unsigned char uc[sizeof(double)];
} u;
do {
for (size_t i = 0; i < sizeof(double); i++) {
u.uc[i] = rand();
}
} while (isnan(u.d));
return u.d;
}
答案 1 :(得分:1)
效率不高,但要正确回答这个问题:
首先定义从整数范围(0,MAX_RAND)到实数的映射。在定义此映射时,确切地确定您想要的分布:统一所有实数,或对数统一,或其他。编写一个给定范围内的整数的函数,根据此映射返回一个double。现在使用rand()并将其提供给您的函数。
答案 2 :(得分:0)
union {
int a;
float b;
} Number;
Number.a = rand();
printf("%f\n", Number.b);
这使用随机整数的位掩码来创建具有相同位掩码的浮点数。