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

上文说到,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。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同步FIFO(First-In-First-Out)是一种数据结构,用于在多个处理器或模块之间传输数据。它按照先进先出的原则,将数据从一个模块传输到另一个模块。 上溢下溢是指在同步FIFO中可能出现的两种情况: 1. 上溢(Overflow):当发送方向FIFO中写入数据的速度大于接收方向FIFO中读取数据的速度时,发送方向FIFO可能会上溢。这意味着发送方向FIFO已经满了,无法再写入更多的数据。上溢可能导致数据丢失。 2. 下溢(Underflow):当接收方向FIFO中读取数据的速度大于发送方向FIFO中写入数据的速度时,接收方向FIFO可能会下溢。这意味着接收方向FIFO已经空了,无法再读取更多的数据。下溢可能导致数据丢失。 为了避免上溢下溢,设计者可以采取一些策略: 1. 增大FIFO的容量:通过增大FIFO的容量,可以容纳更多的数据,减少上溢的可能性。 2. 控制数据的发送和接收速度:通过合理控制发送和接收数据的速度,避免发送方向FIFO写入速度过快或接收方向FIFO读取速度过快,从而减少上溢下溢的风险。 3. 使用流量控制机制:可以使用流量控制机制,如令牌桶算法或信号量,来动态地控制数据的发送和接收速度,以适应不同模块之间的处理能力差异。 综上所述,上溢下溢是同步FIFO中可能出现的问题,设计者可以通过增大FIFO容量、控制数据速度和使用流量控制机制等手段来避免这些问题的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值