浮点值的上溢和下溢(其他数值类型相似)

上文说到,float的取值范围为10^-37~10^38。

如果数字大小超过10^38会怎么样呢?通过本文标题,我们大概可以猜出,这就是一个浮点值的上溢(emmmm……我仿佛是个沙雕)。当计算导致数字过大,超过当前类型的表达范围时,就会发生上溢。现在C语言规定,会给toobig赋一个值表示无穷大的特定值,而且printf()显示该值为inf或infinity(或具有无穷意义的其他内容)(喵喵喵???有木有大佬解释下啊,虽然看到我这篇的人可能少之又少了吧!)

当除以一个很小的数时,情况更复杂。float以指数和尾数部分来储存。若存在一个指数部分为最小值的数,这个数就是float能用的精度所能储存的最小值。现在把他在除以2,通常这个操作会减少指数部分,但现在已经是最小的指数了,所以计算机只能将尾数部分的位向右移,空出一个二进制位,并丢弃最后一个二进制数。(哦,狗屎,看不懂)。这样虽然得到了结果,却原本末尾有效位的数字。这种状况叫做下溢。当然,如果除以一个非常大的值就直接归0了。

还有一个特殊的浮点值NaN(not a number)。例如,给某个函数传递一个值,该函数将返回一个角度。该角度的正弦就是传入函数的值。但是正弦值不能大于1,所以传入的参数如果大于一,,该函数的行为是为定义的。在这种情况下,该函数将返回NaN值。

一般来说,如果你进行了不正确的操作,例如除以0,数组越界?会返回这个NAN。

 

你可能感兴趣的:(c)