首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GSL:错误报告

GSL:错误报告
EN

Stack Overflow用户
提问于 2011-04-19 20:24:28
回答 3查看 3K关注 0票数 0

我想使用GSL来集成http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html,但是我发现没有方便的方法来集成函数

(示例http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html中的函数f)

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

代码语言:javascript
复制
#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;
}

导致输出状态=0状态= -1

我认为集成商应该停止并返回我的错误代码。我如何才能做到这一点?

非常感谢您的帮助!

2011年04月27日:在Brian Gough告诉我之后,我也尝试了这个变体,

代码语言:javascript
复制
#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;
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-29 00:48:43

多亏了GSL邮件列表中的吴学斌,这个问题才得以解决:

嗨,

GSL_ERROR本身就是一个宏,它看起来像

代码语言:javascript
复制
      gsl_error (reason, __FILE__, __LINE__, gsl_errno);
      return gsl_errno;

函数在返回NAN之前就已经返回了,因为已经调用了GSL_ERROR。关闭处理程序只会让第一行什么也不做。打印错误消息后,默认错误处理程序将中止程序。

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

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

宏: GSL_ERROR_VAL (reason,gsl_errno,value)此宏与GSL_ERROR相同,但返回用户定义的值,而不是错误代码。它可用于返回浮点值的数学函数。

以下示例说明如何使用GSL_ERROR_VAL宏返回数学奇异点上的NaN。

代码语言:javascript
复制
 if (x == 0)
   {
     GSL_ERROR_VAL("argument lies on singularity",
                   GSL_ERANGE, GSL_NAN);
   }

所以我根据代码调整了代码

代码语言:javascript
复制
#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;
}

一切都像预期的那样工作。

票数 4
EN

Stack Overflow用户

发布于 2011-04-19 22:12:31

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

票数 0
EN

Stack Overflow用户

发布于 2011-04-19 22:19:57

如何为函数编写一个包装器,它返回指向一个结构的指针,其中包含函数结果和错误状态?或者,如果您使用c++,则可以使用对象进行此封装。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5716288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档