【发布时间】: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