我在visual studio express中使用c生成用于遗传算法类型的程序的随机表达式树.
因为它们是随机的,所以树经常产生:除以零,溢出,下溢以及返回“inf”等字符串.我可以写字符串的处理程序,但文献让我对其他人感到困惑.如果我理解正确,我必须先设置一些标志?
对某些文献的建议和/或指针将不胜感激.
编辑:double变量中返回的值为1.#INF或-1.#IND.我错了,把它们称为字符串.
解决方法
你确定要抓住他们,而不是忽略它们吗?假设你只想忽略它们:
见:
http://msdn.microsoft.com/en-us/library/c9676k6h.aspx
对于_MCW_EM掩码,清除掩码设置异常,这允许硬件异常;设置掩码隐藏异常.
所以你要做这样的事情:
#include <float.h> #pragma fenv_access (on) void main() { unsigned int fp_control_word; unsigned int new_fp_control_word; _controlfp_s(&fp_control_word,0); // Make the new fp env same as the old one,// except for the changes we're going to make new_fp_control_word = fp_control_word | _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW | _EM_UNDERFLOW | _EM_INEXACT; //Update the control word with our changes _controlfp_s(&fp_control_word,new_fp_control_word,_MCW_EM) }
这里的一些混乱可能是使用“异常”一词.在C中,通常是指内置异常处理系统的语言.浮点异常是一个不同的野兽.标准FPU需要支持的例外都在IEEE-754中进行了定义.这些发生在浮点单元内,这可以根据浮点单元的控制标志如何设置而做不同的事情.通常发生两件事之一:
1)异常被忽略,FPU设置一个指示其状态寄存器发生错误的标志.
2)FPU不会忽略该异常,因此产生了一个中断,并且调用了任何设置了浮点错误的中断处理程序.通常情况下,这样做对您来说可能会让您在调试器中的代码行中断或生成一个核心文件.
您可以在这里找到更多关于IEE-754:http://www.openwatcom.org/ftp/devel/docs/ieee-754.pdf
一些额外的浮点引用:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
http://floating-point-gui.de/