浮点异常

今天遇到一个有趣的问题,就是浮点数什么时候是无效的,或者说is Not a Number (Nan),坦白说,写了这么久(有10年了吧)也没有留意过这个问题,开始遇到这个问题的时候,最先想到的还是googlebaidu,顺便用了下我们公司的有道(www.yodao.com,做个广告),都没有找到完美的答案,相反寻求答案的帖子到随处都是,看来还是有很多人碰到过这个问题,经过一番测试,给出一个比较完备的list

形如

结果

Vc表示为

0/0

NaN

-1.#IND

N/0 (N>0)

Infinite

1.#INF

-N/0 (N>0)

-Infinite

-1.#INF

0 * INF

NaN

 

0 * -INF

NaN

 

0 / INF

0

 

INF * INF

Infinite

 

INF * -INF

-Infinite

 

INF / 0

Infinate

 

N * INF

INF

 

NaN 参与计算

NaN

 

以上结果是在vc2005中浮点数计算的测试结果,默认情况下,在vc2005中除0.0计算不会抛出异常,只是计算的结果可能是NaN或者Inf,这在实际的编程中是件让人头疼的事情,我们会不知不觉陷入浮点异常的陷阱,最终的结果不如预期,而要找到这个浮点计算的罪魁祸首可能需要很长时间的调试,因为NaNInf还是可以继续参与计算的。

为了避免浮点计算异常,我们可以通过_controlfp函数设置开启浮点异常检查:

      _controlfp(_EM_INVALID,_MCW_EM);

这样当计算出现INFNaN的时候,会抛出异常,这样变可以快捕捉错误,从而处理,更多信息可以参考MSDN/fp (Specify Floating-Point Behavior)章节。

知道了浮点出会出现NaN,如果不抛出异常的情况下,我们如何判断一个浮点数时不时NaN呢?使用_isnan函数吧,这里需要注意的是INF是一个合法的浮点数,及is a number,所以_isnan函数的检查是可以通过,如果想知道一个float是不是infinite,使用_finiate函数可以检查这样的情况?

转自:http://www.sineysoft.com/blog/post/float_exception.html

浮点异常值:NAN,QNAN,SNAN

32位浮点数在机器中的表示按照IEEE的标准是这样的:

   +------+----------------+-------------------------------+   
   | 1bit    |   8bit               |         23bit                            |   
   +------+----------------+-------------------------------+

其中:1bit表示符号位(0表示正,1表示负),8bit表示指数(0~255,实际指数取值还要减去127,即指数取值区间为-127~128),23bit表示尾数。

这里所要说的浮点异常值就是这种表示产生的几种特殊值,IEEE规定根据指数和尾数的不同分别可表示如下几种特殊值:

1. 零值:按上述的浮点表述形式如果指数部分全部为0,并且尾数全部为0,则表示为浮点0.0,并且规定-0 = +0

2. 非规格化值:如果指数全部为0,尾数非0,则表示非规格化的值,16进制看到的就是[80xxxxxx]h或者[00xxxxxx]h

3. 无穷值:如果指数全部为1,尾数全部为0,则根据符号位分别表示正无穷大和负无穷大,16进制看到的就是[FF800000]h或者[7F800000]h

4. NAN:主角来了,如果指数全部为1,尾数非0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,最常见的莫过于除0运算;SNAN一般被用于标记未初始化的值,以此来捕获异常。

那么既然NAN不是一个真实的数值,在程序如何判断变量是否变成了NAN呢?大部分语言中针对NAN值都有一系列的函数定义,C语言中最常见的三个函数:

_isnan(double x);                  //判断是否为NAN

_finite(double x);                  //判读是否为无穷大

_fpclass(double x);                //返回一系列的定义值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具体参考MSDN

转自: http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html


<think>嗯,用户问的是“fluent浮点异常什么意思”,首先我需要理解这个问题。Fluent通常指的是ANSYS Fluent,这是一款流体动力学(CFD)软件。浮点异常Floating Point Exception)是计算机程序中的一种常见错误,涉及到浮点数的运算问题,比如除以零或者无效的数值操作。 首先,我需要回忆一下浮点异常在Fluent中出现的原因。可能的原因有哪些呢?比如,网格质量问题导致计算中出现奇点,或者物理模型设置不当,例如密度、粘度等参数不合理,导致计算过程中出现不合理的数值。还有可能是边界条件设置错误,比如入口速度过大,导致计算发散。另外,求解器设置的问题,比如时间步长太大,或者松弛因子不合适,也可能引发浮点异常。 接下来,我应该考虑用户可能的背景。用户可能是使用Fluent进行模拟的工程师或学生,遇到了计算崩溃的问题,需要知道错误的原因和解决方法。用户可能对CFD和数值计算有一定的了解,但遇到具体错误时需要指导。 用户的需求不仅仅是了解浮点异常的定义,更想知道如何解决这个问题。因此,回答中不仅要解释错误的原因,还要提供具体的解决步骤。可能需要分点说明可能的原因,然后给出对应的解决建议,比如检查网格质量、调整物理参数、修改边界条件、调整求解器设置等。 另外,还需要注意用户可能遇到的常见情况,比如网格问题,特别是在复杂几何体中,容易出现低质量的网格单元,导致计算不稳定。这时候建议用户检查网格的skewness、aspect ratio等指标,或者使用Fluent的网格修复工具。 还有可能用户没有正确设置材料属性,比如密度设置为零,或者粘度值不合理,导致计算中出现除以零的情况。这时候需要提醒用户检查材料属性,特别是依赖温度或其他变量的属性是否正确。 边界条件方面,比如压力出口设置不当,或者入口条件与物理模型不符,可能导致计算发散。需要建议用户复查边界条件,确保符合实际物理情况。 求解器设置中,时间步长过大可能导致数值不稳定,尤其是在瞬态模拟中。建议用户尝试减小时间步长,或者使用自适应步长。松弛因子设置过松或过紧也可能影响收敛,需要调整到合适的值。 最后,可能需要提到其他可能性,比如软件本身的bug或硬件问题,但这种情况相对较少,应作为最后考虑的选项。 总结一下,回答的结构应该是先解释浮点异常的概念,然后列出可能的原因,再给出针对性的解决方法,帮助用户一步步排查和解决问题。同时,语言要尽量简洁明了,避免使用过于专业的术语,让用户能够理解并操作。</think>在CFD仿真中,"Fluent浮点异常"指ANSYS Fluent因数值计算错误导致的崩溃现象。以下是详细解析及应对策略: **典型触发场景** 1. **网格质量问题** - 表现:出现负体积网格、极端长宽比(>1000)、高扭曲率(Skewness >0.95) - 检查:Mesh → Check → 关注Minimum Volume警告 - 修复:使用Fluent自带的网格修复工具或返回前处理软件重构网格 2. **物理模型冲突** - 常见于:多相流模型误用(如VOF与Mixture模型混用) - 密度比超过1e5时建议改用DPM模型 - 检查材料属性:密度、粘度等是否出现负值或突变 3. **边界条件失配** - 典型错误:压力出口背压设置不合理(如低于环境压力但未启用compressible) - 速度入口设置超音速值但未激活密度基求解器 4. **求解器参数设置** - 时间步长过大:建议初始步长设为特征时间的1/100 - 松弛因子:动量方程建议0.3-0.7,湍流参数保持0.8以上 **紧急调试方法** 1. 启用双精度求解器(Double Precision) 2. 修改求解控制参数: ```text /solve/set/expert → 输入"yes"开启高级选项 → 调整"number of iterations before checking"为10 ``` 3. 监控关键变量: ```text Report → Reference Values → 勾选Monitor残差外的密度、压力极值 ``` **典型错误日志分析** ``` Error: Floating point exception: invalid number ``` - 若伴随"divide by zero"提示:重点检查体积分数方程 - 出现"sqrt domain error":检查湍流模型初始场设置 - 显示"UDF收到nan值":需在UDF中增加数值过滤逻辑 **预防性措施** 1. 初始化时采用分段式加载: - 先运行10步层流模型 - 再逐步激活湍流、能量方程等模块 2. 复杂模型建议分阶段验证: ```text 稳态计算收敛 → 冻结流场转瞬态 → 逐步耦合附加物理场 ``` 遇到该错误时,建议优先导出.dat格式的结果文件,使用Fluent的残差重启动功能进行问题定位。对于瞬态计算,可尝试回退到稳定时间步重新计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值