Error handling GSL:错误报告

Error handling GSL:错误报告,error-handling,integration,gsl,Error Handling,Integration,Gsl,我想使用GSL进行集成 但是,我发现没有一种方便的方式来集成功能 (示例中的函数f) 可以向集成器报告错误。我想集成一个函数,它本身是一个可能失败的集成的结果。这是我的示例程序 #include <stdio.h> #include <math.h> #include <gsl/gsl_integration.h> #include <gsl/gsl_errno.h> double f (double x, void * params) {

我想使用GSL进行集成 但是,我发现没有一种方便的方式来集成功能

(示例中的函数f)

可以向集成器报告错误。我想集成一个函数,它本身是一个可能失败的集成的结果。这是我的示例程序

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
    GSL_ERROR("test error",GSL_FAILURE);
    return 0.0;
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
GSL_错误(“测试错误”,GSL_故障);
返回0.0;
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,
w、 结果和错误);
printf(“状态=%d\n”,状态);
状态=GSL_故障;
printf(“状态=%d\n”,状态);
gsl_集成_工作空间_自由(w);
返回0;
}
导致输出 状态=0 状态=-1

我认为积分器应该停止并返回我的错误代码。我怎样才能做到这一点

非常感谢你的帮助

2011年04月27日:布莱恩·高夫告诉我后,我也尝试过这种变体

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
    GSL_ERROR("test error",GSL_FAILURE);
    return GSL_NAN;
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
GSL_错误(“测试错误”,GSL_故障);
返回GSL_NAN;
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,
w、 结果和错误);
printf(“状态=%d\n”,状态);
状态=GSL_故障;
printf(“状态=%d\n”,状态);
gsl_集成_工作空间_自由(w);
返回0;
}

这也无济于事。现在,我将填写一份bug报告。

有点粗糙,但我可能会让您的函数存储一些标志。当遇到错误时,它将设置标志并为所有后续计算返回零。然后,在您集成它之后,您可以检查这个标志,看看结果是否有效。

有点粗糙,但我可能会让您的函数存储一些标志。当遇到错误时,它将设置标志并为所有后续计算返回零。然后,在集成它之后,您可以检查此标志以查看结果是否有效。

如何为函数编写一个包装器,返回指向结构的指针,其中包含函数结果和错误状态?或者,如果你使用C++,这个封装可以使用对象……< /p> 来写一个函数的包装器,它将指针返回到一个包含函数结果和错误状态的结构。或者如果你使用C++,这个封装可以用对象……< /p> < p>感谢薛斌武从GSL邮件列表中解决的问题:

GSL_错误本身是一个宏,看起来像

      gsl_error (reason, __FILE__, __LINE__, gsl_errno);
      return gsl_errno;
函数在返回NAN之前已经返回,因为GSL_错误 已经打过电话了。关闭处理程序只需让第一行执行即可 没有什么。默认错误处理程序在打印后中止程序 错误消息

我不认为这是一个错误。也许您可以编写自己的错误处理程序 来解决你的问题。例如,您可以使用“goto”跳出 gsl_integration_qags,或设置一些全局变量以指示 积分结果不正确

PS:我相信这个宏就是你需要的

宏:GSL_ERROR_VAL(原因、GSL_errno、值) 此宏与GSL_ERROR相同,但返回用户定义的值 值,而不是错误代码。它可以用于数学计算 返回浮点值的函数

下面的示例演示如何在数学表达式中返回NaN 使用GSL_ERROR_VAL宏的奇点

 if (x == 0)
   {
     GSL_ERROR_VAL("argument lies on singularity",
                   GSL_ERANGE, GSL_NAN);
   }
所以我根据

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
//  return GSL_NAN;
    GSL_ERROR_VAL ("argument lies on singularity", GSL_ERANGE, GSL_NAN);
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
//返回GSL_NAN;
GSL_ERROR_VAL(“论点在于奇点”,GSL_ERANGE,GSL_NAN);
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,
w、 结果和错误);
printf(“状态=%d\n”,状态);
状态=GSL_故障;
printf(“状态=%d\n”,状态);
gsl_集成_工作空间_自由(w);
返回0;
}

一切都按预期进行…

感谢GSL邮件列表中的吴学斌,问题得以解决:

GSL_错误本身是一个宏,看起来像

      gsl_error (reason, __FILE__, __LINE__, gsl_errno);
      return gsl_errno;
函数在返回NAN之前已经返回,因为GSL_错误 已经打过电话了。关闭处理程序只需让第一行执行即可 没有什么。默认错误处理程序在打印后中止程序 错误消息

我不认为这是一个错误。也许您可以编写自己的错误处理程序 来解决你的问题。例如,您可以使用“goto”跳出 gsl_integration_qags,或设置一些全局变量以指示 积分结果不正确

PS:我相信这个宏就是你需要的

宏:GSL_ERROR_VAL(原因、GSL_errno、值) 此宏与GSL_ERROR相同,但返回用户定义的值 值,而不是错误代码。它可以用于数学计算 返回浮点值的函数

下面的示例演示如何在数学表达式中返回NaN 使用GSL_ERROR_VAL宏的奇点

 if (x == 0)
   {
     GSL_ERROR_VAL("argument lies on singularity",
                   GSL_ERANGE, GSL_NAN);
   }
所以我根据

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>

double f (double x, void * params) {
//  return GSL_NAN;
    GSL_ERROR_VAL ("argument lies on singularity", GSL_ERANGE, GSL_NAN);
}



int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);

double result, error;

gsl_function F;
F.function = &f;

gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
                     w, &result, &error); 

printf ("status          = %d\n", status);
status  = GSL_FAILURE;
printf ("status          = %d\n", status);


gsl_integration_workspace_free (w);

return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
//返回GSL_NAN;
GSL_ERROR_VAL(“论点在于奇点”,GSL_ERANGE,GSL_NAN);
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,