【问题标题】:Strange logf behavior when calculating Poisson packet generation times in Contiki OS在 Contiki OS 中计算泊松数据包生成时间时出现奇怪的 logf 行为
【发布时间】:2016-06-09 18:44:48
【问题描述】:

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

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/)。

【问题讨论】:

    标签: floating-point msp430 contiki


    【解决方案1】:

    我很惊讶你可以使用 rand()。
    在 Contiki 中,要生成 rand 数,您需要使用 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 没有很好地定义,你就会溢出,给你一个有符号的数字。转换成 unsigned 就行了。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 请不要发布 cmets 作为答案。
      猜你喜欢
      • 2019-12-02
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2011-06-26
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      相关资源
      最近更新 更多