0

我知道 if(value==value) 可以解决问题,但是在我的应用程序中,我需要检查 50 多个变量,并且检查每个变量有点乏味并且可能效率低下。理想情况下,我正在寻找的是在子程序结束之前我可以调用一个函数(如果存在这样的函数),它将返回 1 或 0。我有一种感觉,因为在汇编中存在这样一个可以检查全局浮动的函数点状态寄存器。如果不是这种情况,那么有没有比轮询每个浮点变量的 value==value 更好的方法?

4

3 回答 3

3

您可以使用isnanfpclassify。两者都是 C99 的标准配置。

至于你的问题,如果你的变量都在某个共同的地方声明,我会写一个小工具来把这些声明变成一个isnan调用字符串。

于 2012-10-04T08:15:55.643 回答
3

一般来说,没有办法问“我的数据中是否有 NaN?”</p>

检查处理器的浮点寄存器不足以回答这个问题,因为浮点对象的值保存在内存中以及计算的各个点的寄存器中,特别是如果你有 50 个。

有一种方法可以询问“是否发生了无效操作异常?” C 标准的第 7.6 条通过定义在 . 各种编译器对它的支持可能很差。本质上,您可能希望使用 feclearexcept 清除 FE_INVALID,执行一些计算,并测试是否已使用 fetestexcept 设置了 FE_INVALID。您还需要设置“#pragma STD FENV_ACESS on”。

这只会测试在您的计算过程中是否发生无效操作异常。它不会测试您的输入数据中是否存在 NaN。它不会测试在没有无效操作异常的情况下生成的 NaN。

于 2012-10-04T11:50:30.777 回答
0

也许这样的事情可能会有所帮助?

void registerAddVariable(double *x) {
  APPEND(x); // append to some global linked list
}
void registerRemoveVariable(double *x) {
  REMOVE(x); // remove from same global linked list
}
void registerDebug() {
  list = head; 
  while(list) {
    if (isnan(*(list->variable))) {
      output(list);
    }
    list = list->next;
  }
}

void myfun() {
  double variable; registerAddVariable(&variable);
  ...
  registerDebug();
  ....
  registerRemoveVariable(&variable);
}
于 2012-10-04T12:28:30.533 回答