0x3f3f3f3f--无穷大

2024-03-20 11:32
文章标签 无穷大 0x3f3f3f3f

本文主要是介绍0x3f3f3f3f--无穷大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。

  1. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:
    if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
    我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。
  2. 除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。

所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确是从一位不认识的ACMer(ID:Staginner)的博客上学到的,他/她的很多代码中都使用了这个常量,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。

  1. 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
  2. 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
  3. 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。

这篇关于0x3f3f3f3f--无穷大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829317

相关文章

从一到无穷大 #34 从Columnar Storage Formats评估到时序存储格式的设计权衡

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言Parquet / ORC功能与结构对比差异Indexes and Filters压缩影响 TsFile总结 引言 随着 Parquet,ORC,TsFile等开源存储格式的发展,各家时序厂商的压缩

单机无穷大系统短路比计算公式

变流器的短路比(Short Circuit Ratio, SCR)是衡量变流器在接入电网时对电网稳定性影响的一个重要指标。它通常用于评估变流器在弱电网条件下的运行性能。变流器的短路比计算与传统发电机有所不同。 变流器短路比的定义: 变流器的短路比是电网短路容量与变流器额定容量之比。 计算公式: SCR = S s c S i n v \text{SCR} = \frac{S_{sc}}

C++ 中的负无穷大赋值

1,代码先行 示例: #include<iostream>#include<limits>using namespace std;int main(){float inf_pos = numeric_limits<float>::infinity();float inf_neg = -1*inf_pos;cout << "inf_pos = " << inf_pos << endl;cou

ACM中无穷大的设置

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,

从一到无穷大 #26 Velox:Meta用cpp实现的大一统模块化执行引擎

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言业务案例PrestoSparkXStreamDistributed messaging systemData IngestionData PreprocessingFeature Engineering 组件T

翁恺C语言程序设计:学习笔记6(无穷大\计算精度\char\逃逸字符\回车换行与打字机)

无穷大与不存在的数1 浮点数/0:无穷大(正负); 0/0:不存在的数; 整数/0:编译不通过,在C语言中,整数范围内是没有无穷大的,但是浮点数范围内是有无穷大的。 float有7位有效数字; a=1.345f 带有一个f才表示float,不然就是double; 表示相等时尽量不用==,因为精度问题;可以采用fabs(a-b)<1e-12,两者差的绝对值小于很小的数。 计算精度 当需要计算精确

关于0x3f3f3f3f(0x四个3f)

在之前一道最小生成树问题中遇到过,我按照以前的习惯把INF定义为10亿,然后初始化数组为最大值,然后输入连通的路+value,最后值仍然为INF的即为不通的。但是这里出问题了,INF定义为10亿的话,最后显示的数组的值是负的,最后改成0x3f3f3f3f终于解决了。 今天正好看到一篇相关的博客,故细细分析一下。 引用自:http://blog.csdn.net/bossup/article/d

数组设置成无穷大和无穷小

memset(min1,0x3f,sizeof(min1));     memset(max1,128,sizeof(max1));

从一到无穷大 #24 LogReducer:讨论日志中热点的影响,识别及在线解决方法

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言LogReducer系统性分析日志影响,原因在线日志缩减框架 反省总结 引言 排查问题单效率依赖于可观测性三件套 Logging,Metrics 和 Tracing。Metrics(时序数据库,ES

从一到无穷大 #23 《流计算系统图解》书评

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言内容总结 引言 春节假期回到家里断然是不会有看纸质书的时间的。造化弄人,二月三号早上十一点的飞机延误到一点多,原本三小时不到的阅读时间延长为五个小时,也给了我看完这本书的机会。 第一次了解到这本书