0

我试图将两个相等价值的双打分开最小数量。上下文是一个事件模拟。我不希望事件同时发生,因此我将设置为发生新事件的时间增加了最小量。

(这很烦人(自我实现的 RNG),所以我实际上需要进行调查,直到找到没有事件发生的时间。)

目前,我的代码想做这样的事情(未经测试,视为伪代码):

typedef struct event 
 { 
   double time;
   struct event* nexteventinqueue;
 } event;
//insert newevent into the queue:
void add(event *newevent)
{
static event *firsteventinqueue = NULL;
if(firsteventinqueue == NULL)
{
    firsteventinqueue = newevent;
    return;
}
event *currentevent = firsteventinqueue;
event *temp;
//find an event point in the queue that does not precede the new event.
while((currentevent->time) < (newevent -> time))
{
    temp = currentevent;
    currentevent = currentevent->nexteventinqueue;
}
if(currentevent == NULL)//no such event found, so tag it onto the end.
{
    temp->next = newevent;
    return;
}
//handle coincidences by delaying the new event
while((currentevent->time) == (newevent->time))
{
    double d = (maximally precise increment of a double precision floating point number);
    while((currentevent->time) == (newevent.time)) //loop I want to get rid of
    {
        newevent.time += d;
        d *= 2;
    }
    temp = currentevent;
    currentevent = currentevent.nexteventinqueue;
}
temp.nexteventinqueue = newevent;
newevent.nexteventinqueue = currentevent;
return;
}

现在有很多问题,但我想以某种方式摆脱中间的while循环。我的大部分时间甚至都没有接近双浮点可以聚集的最大精度,所以假设他们这样做是浪费时间,而且因为我的 RNG 不是特别随机,这个循环必须执行得相当频繁地。

有没有办法(1)直接增加双浮点变量的小数部分,或者(2)找出给定浮点变量 x 在小于 O(log(x)) 时的精确度?

4

2 回答 2

2

使用nextafter(from <math.h>) 获取紧跟在双精度值之后的下一个最大值。(或者nextafterf对于单精度值)。

如需更多信息,man nextafter点击此处。

于 2014-11-13T05:51:12.357 回答
0

在@Brendan 的评论和@rici 的评论之后,了解为什么integer表示最终将决定最小值nextafter是什么以及为什么它是integer precision控制的可能会很有用。Floats/doubles存储IEEE-754 single/double precision floating point format在内存中。对于每个floatdouble都有一个integer对应于 的表示floating point representationnext可用增量或nextafter值是 处的值的增量bit-0。以下示例说明了数字的要点123.456(为节省空间而显示的 float 示例,double 只是涉及的位数较多):

Example of next value for   : 123.456

    The float value entered : 123.456001

    As unsigned integer     : 1123477881

    binary value in memory  : 01000010-11110110-11101001-01111001

    next larger int value   : 1123477882

    binary value in memory  : 01000010-11110110-11101001-01111010

    next larger float value : 123.456009

为了找到下一个可能的增量值,内存中的值增加1(或者1如果最高有效位是1(表示负值)则减少)。然后将结果转换回浮点数以提供下一个可能的浮点值。Brendan 的观点很好理解。通过使用整数值,您可以避免nextafter计算的必要性。但无论您使用的是浮点数还是整数值,内存中的最小增量仍然是1to的增量(或减量) bit-0123.456001对于上面的示例,它是和(单精度)之间的差异,123.456009如下所示:

IEEE-754 Single Precision Floating Point Representations

  0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
  |s|      exp      |                  mantissa                   |

  0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 0
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
  |s|      exp      |                  mantissa                   |

希望视觉和解释能增加理解。注意:不涉及实际的“翻译”或“转换”。它只是在内存中查看与浮点数或整数相同的值。与您的代码的唯一区别是您是添加1还是添加更多代码行来找出floating point添加后的下一个值是什么1。它们都不是处理器或时间密集型的。

于 2014-11-13T06:41:57.690 回答