程序运行结果为NaN,应当从哪些方面解决

程序运行结果为NaN,应当从哪些方面解决,第1张

第一,你的程序public首写字母不应该大写,catch也是第二:exception e后面少了一个括号 第三:finally后面的outNaNintln应改成out.println 第四:,解决以上问题后,输出的结果是: 执行try 执行finally

NaN = Not a Number    一般出现这个东西的原因有两个

1)你的程序里出现0作为分母的运算,这个时候可以考虑把被除矩阵整体加一个无限小量,例如1e-10。这样可以消除0作分母的现象。

2)如果上面这个做法不管用,一般就是你自己的算法和编程的问题了,导致结果不收敛,发散。多次迭代后无穷大,超过了matlab允许的数值范围。这个时候你必须去仔细检查你的程序了。

希望能帮到你啊!~

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

对于上面的程序

unsigned long nan[2]={0xffffffff, 0x7fffffff}

定义一个64位的空间,内容为0x7fffffffffff,最高符号位为 0,其它位全为1,细分NAN的话,就是上面的QNAN。

然后转化为double,

*(double*)nan这里nan为数组名,实际值为数组地址,先转化为(double*)指针,再取值*(double*)

至于要这样写,而不是直接double a = 0x7fffffffffff是为了不让编译器转化整形值0x7fffffffffff到浮点型(按IEEE 754定义的格式存储)。

这里直接分配64位空间,然后写好值,直接告诉编译器,这个地方的数据是double,以后程序再访问这个double值,发现它的内容是0x7fffffffffff,程序就知道这个是NaN了


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12164339.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存