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