Floating point 计算Contiki OS中泊松包生成时间时奇怪的logf行为

Floating point 计算Contiki OS中泊松包生成时间时奇怪的logf行为,floating-point,msp430,contiki,Floating Point,Msp430,Contiki,我的目标是使用MSP430实验板(Exp430)平台在Contiki Cooja中根据泊松分布生成数据包(同样的问题也适用于Zolertia Z1微尘,它也有基于MSP430的MCU)。我包括数学库,并将泊松分布编码为: float nextTime = (-2.000) * logf((rand() / (float)RANDOM_RAND_MAX)); 其中,代码背后的实际公式为-a*ln(rand),其中rand必须是介于0和1之间的浮点数。我创建了一个模拟并测试了生成的nextTime

我的目标是使用MSP430实验板(Exp430)平台在Contiki Cooja中根据泊松分布生成数据包(同样的问题也适用于Zolertia Z1微尘,它也有基于MSP430的MCU)。我包括数学库,并将泊松分布编码为:

float nextTime = (-2.000) * logf((rand() / (float)RANDOM_RAND_MAX));
其中,代码背后的实际公式为-a*ln(rand),其中rand必须是介于0和1之间的浮点数。我创建了一个模拟并测试了生成的nextTime,我意识到它经常生成0.000。然后,我将代码分成小块,看看是什么值导致生成0.000,如下所示:

float inner1 =(float)( (rand() / (float)RANDOM_RAND_MAX));

float inner2 = logf(inner1);

float nextTime =  (float) (-2.000)*inner2;

导致nextTime计算为0.000的inner1值之一为0.135。然后我将inner1设置为0.135并重新加载模拟,得到的结果是inner2为-2.2,nextTime为4.5。这让我很困惑,因为当我将inner2设置为常量时,nextTime的计算是正确的。但正是这个值导致nextTime之前为0.000。我真的很好奇,为什么会这样。顺便说一句,我知道在Contiki中打印浮点值是不受支持的,我使用了两种不同的解决方案来正确打印这些浮点值(和)

我很惊讶你能使用rand()。
在contiki中,要生成随机数,需要使用
random\u rand()

包括:
#包括“lib/random.h”

编辑:有关更多说明:
random\u rand()
的代码:


因此,无论发生什么情况,它都返回未签名的short。如果RAND_MAX没有很好地定义,您将有一个溢出,给您一个有符号的数字。加入未签名的角色,请表演这个把戏。

非常感谢您的回复和帮助。我想我跳过了使用random_rand(),尽管在其他源文件中我也使用过它。似乎使用普通的rand()而不是Contiki random_rand()导致了一个问题,我不知道在后台发生了什么。无论如何,它解决了问题。谢谢。

请不要将评论作为答案发布。
unsigned short
random_rand(void)
{
/* In gcc int rand() uses RAND_MAX and long random() uses RANDOM_MAX=0x7FFFFFFF */
/* RAND_MAX varies depending on the architecture */

  return (unsigned short)rand();
}