在Contiki OS中计算Poisson数据包生成时间时的奇怪logf行为

时间:2016-06-08 14:06:03

标签: 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 我意识到它经常产生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中的打印浮动,我使用了两种不同的解决方案来正确打印这些浮动值(How to print floating point value using putchar?https://sourceforge.net/p/contiki/mailman/message/25936733/)。

2 个答案:

答案 0 :(得分:1)

我很惊讶你可以使用rand() 在contiki中,要生成兰特数,您需要使用random_rand()
并包括:#include "lib/random.h"

编辑:有关详细说明: 代码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();
}

无论发生什么,它都会返回unsigned short。如果RAND_MAX没有很好地定义,你将有溢出,给你一个签名号码。投射到无符号就行了。

答案 1 :(得分:0)

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