关于浮点值的上溢和下溢和不符合“常识”的情况&整数上溢和整数下溢~

一:关于浮点值的上溢

上溢:是指由于数字过大,超过当前类型所能表示的范围

这种行为在过去是没定义的,不过现在C语言规定,在这种情况下会给toobig赋上一个表示无穷大的特定值,而且printf显示该值为inf或infinity。

比如对于vs2010来说,如果一个值发生了上溢,显示的就是1.#INF00e+000~


二:关于浮点数的下溢

下溢:是指由于数值太小,低于当前类型所能表示的最小的值,计算机就只好把尾数位向右移,空出第一个二进制位,但是与此同时,却损失了原来末尾有效位上面的数字,这种情况就叫做下溢。


PS.C语言把损失了精度的浮点值称为低于正常的浮点值。

由此看来,如果这是的值正好介于最小的浮点数那里,除以10都会使其变成一个低于正常的值,比如,除以10后向右移了1位,则会舍掉丢失的那一位,但是C编译器本身会产生一些十分接近原来丢失这位的值补在后面,eg.下面这个程序所显示的。

当然,如果除以一个很大的数,就会造成所有位均为0的结果,因为每一位在右移的过程中都舍去了==


#include
   
   
    
    
int main(void)
{
	float toobig = 9999999e100*100.0f;
	float temp = 0.1234e-37 / 10;
	float toosmall = 0.1234e-38/10;
	printf("%e\n", toobig);
	printf("%e\n", temp);
	printf("%e\n", toosmall);
	getchar();
	return 0;
}


//输出结果:1.#INF00e+000     1.23000e-039     1.233997e-040
//从输出结果上分析,toobig发生了上溢,temp正常,toosmall发生了下溢~
   
   


三:不符合“常识”的情况
比如:asin()函数里面的值应该是-1~1的,返回值是参数对应的弧度值。但是如果参数输入的是1.5,那么这就是一个不符合常识的情况了;还有像sqrt(-1),这也是一个不符合常识的情况。
所以综上,我们对什么叫不符合常识的情况有了一个基本的了解,那么下面我们来看看在这种情况下会输出什么呢?

在c语言里,输出的是IND,在linux里面输出的是NAN(not a number)。
下面就举具体的代码来说明这种不符合尝试的情况~

#include
    
    
     
     
#include
     
     
      
      
int main(void)
{
	double a = asin(1.5);
	printf("%lf", a);
	getchar();
	return 0;
}

//输出结果为-1.#IND00
//IND也就是我们所说的不符合常识的情况在C语言里面的输出结果
     
     
    
    


&


整数上溢,整数下溢

这两种其实是一个道理,比如signed char型的变量,赋值128就是上溢了,那么输出结果就是-128;赋值-129就是下溢了,那么输出结果就是127;赋值256,那么输出结果就是0。

是熟悉的套路~

就不细说啦~

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
同步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容量、控制数据速度和使用流量控制机制等手段来避免这些问题的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值