C gfortran对浮点异常发出警告

C gfortran对浮点异常发出警告,c,exception-handling,floating-point,fortran,gfortran,C,Exception Handling,Floating Point,Fortran,Gfortran,我在用gfortran编写代码。一段时间以来,我一直在用 -ffpe-trap=zero,overflow,invalid 试图找到一些虫子。这会导致我的程序立即停止执行。在某些情况下,FPE可能正常,因此会出现如下标志: -ffpe-warn=zero,overflow,invalid 这将非常有用。gfortran(或任何其他编译器)是否提供类似的功能?如果没有,是否有解决办法?我目前的想法是创建一个C函数来注册一个信号处理程序来写出警告,尽管我不知道如何去做。我不知道遇到浮点异常时如何

我在用gfortran编写代码。一段时间以来,我一直在用

-ffpe-trap=zero,overflow,invalid
试图找到一些虫子。这会导致我的程序立即停止执行。在某些情况下,FPE可能正常,因此会出现如下标志:

-ffpe-warn=zero,overflow,invalid

这将非常有用。gfortran(或任何其他编译器)是否提供类似的功能?如果没有,是否有解决办法?我目前的想法是创建一个C函数来注册一个信号处理程序来写出警告,尽管我不知道如何去做。

我不知道遇到浮点异常时如何发出警告。但是gfortran和ifort都有信号处理例程。例如,请参见和的gfortran文档 英特尔Fortran编译器(请参阅第410页的“wards”)

通过调用
信号
,可以为信号建立以下操作之一:

  • 忽略指定的信号(由数字标识)
  • 使用指定信号的默认操作,可以重置先前建立的操作
  • 将控制权从指定的信号转移到接收由名称指定的信号的过程
在您的情况下,您可能希望编写一个函数,在发生浮点异常时执行某些操作(例如打印文件名/行号),并使用上面列表中的第三个选项

不幸的是,这不是非常可移植的:看看各种编译器的信号处理示例。如果愿意,可以在预处理器宏中封装一些代码

  • 使用多个编译器编译
  • 仅当设置了某些预处理器标志时才使用信号处理例程(参见)

更新:正如High Performance Mark所建议的那样,
ieee_exceptions
内部模块的异常处理功能最终将是实现这一点的便携方式。

我不知道遇到浮点异常时的警告方式。但是gfortran和ifort都有信号处理例程。例如,请参见和的gfortran文档 英特尔Fortran编译器(请参阅第410页的“wards”)

通过调用
信号
,可以为信号建立以下操作之一:

  • 忽略指定的信号(由数字标识)
  • 使用指定信号的默认操作,可以重置先前建立的操作
  • 将控制权从指定的信号转移到接收由名称指定的信号的过程
在您的情况下,您可能希望编写一个函数,在发生浮点异常时执行某些操作(例如打印文件名/行号),并使用上面列表中的第三个选项

不幸的是,这不是非常可移植的:看看各种编译器的信号处理示例。如果愿意,可以在预处理器宏中封装一些代码

  • 使用多个编译器编译
  • 仅当设置了某些预处理器标志时才使用信号处理例程(参见)

更新:正如High Performance Mark所建议的那样,
ieee_exceptions
内部模块的异常处理功能最终将是实现这一点的可移植方式。

这种假定的运行时警告机制如何工作?gfortran是否提供了(相对较新的)ieee_算术内部模块?如果是这样的话,这将为您提供在Fortran中执行自己的f-p“错误”捕获所需的工具。@DavidHefferman当引发运行时异常时,执行将停止,并打印一条关于异常发生位置和程序退出的消息。我只希望在异常发生的时间/地点得到通知(可能会向stderr发送一条消息),并允许执行继续进行。也许那是不可能的。。。我不知道这些东西是怎么工作的…@HighPerformanceMark我不知道。该代码实际上不是我的代码,需要可移植到大量不同的编译器中——我只是询问gfortran,因为这是我在开发中通常使用的编译器。这种假定的运行时警告机制如何工作?gfortran是否提供了(相对较新的)ieee_算术内在模块?如果是这样的话,这将为您提供在Fortran中执行自己的f-p“错误”捕获所需的工具。@DavidHefferman当引发运行时异常时,执行将停止,并打印一条关于异常发生位置和程序退出的消息。我只希望在异常发生的时间/地点得到通知(可能会向stderr发送一条消息),并允许执行继续进行。也许那是不可能的。。。我不知道这些东西是怎么工作的…@HighPerformanceMark我不知道。这段代码实际上不是我的代码,需要能够移植到大量不同的编译器中——我只是问一下gfortran,因为这是我在开发中通常使用的编译器。很高兴了解Fortran的信号处理——尽管我可能会用C来做这部分,因为它更标准一点。我仍然不知道如何获取发生异常的行号/filename/stacktrace——在谷歌上搜索一下让我觉得这将是一件非常麻烦的事情。很高兴了解Fortran的信号处理——尽管我可能会用C来完成这一部分,因为它更标准一点。我仍然不知道如何获取发生异常的行号/filename/stacktrace——谷歌搜索一下让我觉得这将是一件相当混乱的事情。