处理浮点异常 我不确定如何处理C或C++中的浮点异常。在wiki中,存在以下类型的浮点异常:

处理浮点异常 我不确定如何处理C或C++中的浮点异常。在wiki中,存在以下类型的浮点异常:,c++,c,exception,floating-point,signals,C++,C,Exception,Floating Point,Signals,当上述任何类型的异常发生时,程序是否会异常退出?或者程序会继续执行此错误而不提及任何内容,从而使错误难以调试 像gcc这样的编译器是否能够针对某些明显的情况发出警告 在编写程序的过程中,我可以做些什么来通知错误发生的位置以及错误发生时的类型,以便在代码中轻松找到错误?请给出C和C++案例中的解决方案。 谢谢和问候 有很多选择,但754引入的一般哲学和默认哲学是不陷阱,而是产生特殊结果,例如可能出现或不出现在重要结果中的无穷大 因此,测试单个操作状态的函数没有测试结果表示形式的函数那样经常使用 例

当上述任何类型的异常发生时,程序是否会异常退出?或者程序会继续执行此错误而不提及任何内容,从而使错误难以调试

像gcc这样的编译器是否能够针对某些明显的情况发出警告

在编写程序的过程中,我可以做些什么来通知错误发生的位置以及错误发生时的类型,以便在代码中轻松找到错误?请给出C和C++案例中的解决方案。
谢谢和问候

有很多选择,但754引入的一般哲学和默认哲学是陷阱,而是产生特殊结果,例如可能出现或不出现在重要结果中的无穷大

因此,测试单个操作状态的函数没有测试结果表示形式的函数那样经常使用

例如,见

LIST OF FUNCTIONS

 Each of the functions that use floating-point values are provided in sin-
 gle, double, and extended precision; the double precision prototypes are
 listed here.  The man pages for the individual functions provide more
 details on their use, special cases, and prototypes for their single and
 extended precision versions.

 int fpclassify(double)
 int isfinite(double)
 int isinf(double)
 int isnan(double)
 int isnormal(double)
 int signbit(double)
更新: 对于那些认为FPU操作会在默认情况下生成SIGFPE的人,我鼓励你们尝试这个程序。您可以很容易地生成下溢、溢出和被零除。您不会生成的(除非在最后一个幸存的VAX或非754 RISC上运行)是SIGFPE:

#include <stdio.h>
#include <stdlib.h>
int main(int ac, char **av) { return printf("%f\n", atof(av[1]) / atof(av[2])); }
#包括
#包括
intmain(intac,char**av){返回printf(“%f\n”,atof(av[1])/atof(av[2]);}

不同的编译器以不同的方式处理这些错误

不精确性几乎总是绝对值大于1的数的除法的结果(可能通过trancendental函数)。绝对值大于1.0的数字加、减、乘只能导致溢出

下溢不经常发生,在正常计算中可能不会引起关注,除了迭代函数(如泰勒级数)

溢出是一个通常可以通过某种“无限”比较检测到的问题,不同的编译器会有所不同

被零除是很明显的,因为如果没有错误处理程序,程序将(应该)崩溃。检查股息和除数将有助于避免该问题

无效答案通常在没有特殊错误处理程序的情况下捕获,并打印出某种域错误

[编辑]

这可能会有帮助:(Sun提供的数值计算指南)

在Linux中,您可以通过捕获SIGFPE信号来捕获这些异常。如果您什么也不做,这些异常将终止您的程序。要设置处理程序,请使用signal函数,传递您希望捕获的信号,以及在信号触发时调用的函数。

在Linux上,您可以使用GNU扩展(隐藏在该页底部)若要启用浮点异常捕获,请执行此操作,当发生异常时,您将收到信号SIGFPE,然后可以在调试器中捕获该信号。但请注意,有时浮点指令上的信号会在实际导致问题的指令之后抛出,从而在调试器中提供误导性的行信息

C99引入了处理浮点异常的函数。在执行浮点操作之前,可以使用
feclearException()
清除任何未完成的异常。在操作之后,您可以使用<代码> FESTESTNORT()/<代码>测试设置了哪些异常标志。在VisualC++中,Windows上的

< P>可以控制使用哪些非浮点异常。无掩码浮点异常会生成结构化异常,可以使用
\uuuu try
/
\uu
以外的机制(以及一些其他机制)来处理这些异常。这完全依赖于平台

如果隐藏浮点异常,检测这些条件的另一种平台相关方法是使用清除浮点状态,执行计算,然后使用查询浮点状态

这比DigitalRoss建议的检查结果好吗?在大多数情况下,情况并非如此。如果您需要检测(或控制)舍入(这不太可能),那么可能吗


在Windows上使用Borland /CordPort/NavCabeRoC++,默认情况下,一些浮点异常是未被屏蔽的,这常常会导致使用未被测试的第三方库没有被掩盖的浮点异常时出现问题。你有什么想法吗?linux和windows都有,尽管我现在更经常使用linux。我不知道ISO/IEEE定义的浮点语义将如何依赖于操作系统。谢谢!是否有可能知道并打印出处理信号的函数中发生异常的位置?这不是真的。一般来说,只有754之前的系统才能为单个操作生成SIGFPE。此外,像不精确和下溢这样的事情从来都不是例外。该程序可以生成x/0、溢出和下溢。它不会生成SIGFPE
#include#include int main(int ac,char**av){返回printf(“%f\n”,atof(av[1])/atof(av[2]);}
我应该补充一点,您无论如何都不关心许多粘性位。下溢是很少见的,和零下溢差不多。不精确太常见了,不必在意。谢谢!测试每个表达式的结果似乎太难在代码中处理。即使对某些结果的测试被认为是重要的,但没有测试的结果仍然很可能会抛出异常。我所希望做的就是捕获异常以报告它发生的位置和类型。不会出现异常,并且在操作后不必进行测试。C99确实引入了测试FPU粘性位的功能,但它们仍然不是通用的,即使它们是,你也不想浪费时间。谢谢,迈克!如果没有打电话给feenableexc
#include <stdio.h>
#include <stdlib.h>
int main(int ac, char **av) { return printf("%f\n", atof(av[1]) / atof(av[2])); }