关于计算机内的无穷(infinite)[INF](C/C++)(ACM)

关于计算机内的无穷(infinite)(C/C++)(ACM)

学习自大佬:链接

在ACM竞赛中,我们经常需要一个数,来表示无穷的概念,众所周知,在数学意义上,无穷不是一个准确的数值,但计算机,甚至现实中的任何物质,都禁不起“无穷”概念的穷追猛打。
ACMer确实需要在概念上退让,找一个数(通常是32bits int),来表示无穷。
对于熟悉十进制的正常人来讲,’9’是数字中的最大值,所以常用类似”99999999”的数来表示无穷,但是…这就凸显不出程序员的专业性啦,而且确实不好用。
我们采用16进制来配合数据类型二进制的储存方式。
众所周知,0x7fffffff是int类型的最大值,但这并不是一个很好的选择。
正所谓,物极必反,此正无穷只要再加上小小的1,二进制防线就会全面崩塌,后方的31个1如排山倒海般袭来,多米诺骨牌似的献身那第32位的0。此后,1即是0,0即是1,正无穷成了负无穷
世上的黑白便是这般脆弱
在最短路求值过程中,我们经常需要进行“松弛”操作:

dis[i] = min(dis[i], dis[j] + e[j][i])

此时,若初始化dis[n]=INF=0x7fffffff
整型运算溢出,变成负无穷,显然不符合数学中的“正无穷+有穷数仍为正无穷
在这种情况下,我们亟需一个新的“无穷”来拯救ACMer。
这时,0x3f3f3f3f出现了,俗话说,“妙,不可言”
0x3f3f3f3f的十进制为1061109567‬,与0x7fffffff同属1e9数量级,而ACM中的数据大多不会超过1e9,所以符合无穷的概念(起码比正常数据大啦)
而0x3f3f3f3f的两倍为0x7e7e7e7e仍在int范围之内,未溢出,保证了加法运算的安全。
同时,还有一个额外的好处,由于每个字节数值相同,所以可以用memset(a,0x3f,sizeof(a))的形式初始化INF,提高效率

发布了4 篇原创文章 · 获赞 1 · 访问量 102

猜你喜欢

转载自blog.csdn.net/qq_33374268/article/details/104481904