为什么算法中会出现magic number

算法中会出现magic number的原因:1、经验所得;2、代码多次计算;3、缺少宏定义或常量;4、代码重构不彻底。经验所得是指一段代码经过多次测验,发现某个数字可以在某种情况下最接近你最想要的结果,那么这个数字就会变成magic number。

一、算法中会出现magic number的原因

1、经验所得

经验所得是指一段代码经过多次测验,发现某个数字可以在某种情况下最接近你最想要的结果,那么这个数字就会变成magic number。例子:如果平常随机种子都用时间戳,但突然用一个特定的数字做随机种子,往往随机出来的结果都比较好。

2、代码多次计算

代码在多次计算后,得出一个结果用于最终程序。例如一个展开式中的某个系数,用于某迭代过程;或者是在预处理过程中得出的结果直接使用到最终程序中等等。例子:quake3中的sqrt。

3、缺少宏定义或常量

在修改代码时,可能会忽略一些常量的值,特别是嵌套深度很深的条件语句中的常量,导致代码中存在未被修改的“Magic Numbers”。

4、代码重构不彻底

在编写代码时,可能会缺乏合适的宏定义或常量,这可能导致在代码中使用硬编码的数字(“Magic Numbers”)。

二、magic number简介

魔术数字(magic number)是程式设计中所谓的直接写在程式码里的具体数值(如“10”“123”等以数字直接写出的值)。虽然程式作者写的时候自己能了解数值的意义,但对其他程式员而言,甚至制作者本人经过一段时间后,会难以了解这个数值的用途,只能苦笑讽刺“这个数值的意义虽然不懂,不过至少程式会动,真是个魔术般的数字”而得名。

所谓魔数和魔字符串就是指在代码中出现但没有解释的数字常量或字符串,又称魔法值。如果在某个程序中你使用了魔数,那么在几个月或几年后你将很可能不知道它的含义是什么。大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,识别一个文件的类型就用到了我们提到的“魔数”。很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)这几个字节的内容也被称为魔数,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。

三、magic number分类

1、有害的magic number

指的是代码中出现的没有说明的数字。代码中突然出现一个没说明用途的数字会让其它阅读代码、维护代码的的人非常难受。例如:

const int N = 2073600;
for (int i=0; i<N; i++)
 { ......

看代码的人需要猜2073600是什么意思,而且特别难猜。改成这样就清楚多了:

const int WIDTH = 1920;
const int HEIGHT = 1080;
int totalPixels = WIDTH * HEIGHT;

这里的“魔数”就是指代码中直接出现的数字。现代编程规范比较忌讳这样写代码,一方面看不懂意思,另一方面如果2073600这个数字多次出现,一旦需要修改的时候就需要全部找出来改掉,一旦少改一处就会产生BUG,非常麻烦。我们在编程中要尽可能避免使用“魔数”,例如写3.1416这种数字,也应该改为数学库中的π常数,例如Unity中的Mathf.PI

2、有益的magic number

最典型的例子就是现代3D游戏之父约翰·卡马克在雷神之锤中的那个魔数:

i = 0x5f3759df - ( i >> 1 );

配合前后的代码,这句代码可以快速计算一个数字的平方根的倒数。具体推导过程比较复杂,涉及到浮点数的原理。这个操作给了其它人非常大的震撼,是那个年代的大神级编程技术的缩影,所以被人们怀着敬仰之情称之为“魔数”,全称为“如魔法一样神奇的数字”。

3、一般的magic number

某些具有特定格式的文件,喜欢在文件开头写几个特殊的字符以表明自己的身份,以便验明正身。例如常见的几种图片格式的文件:

  • JPEG (jpg),文件头:FFD8FF 
  • PNG (png),文件头:89504E47 
  • GIF (gif),文件头:47494638 
  • Windows Bitmap (bmp),文件头:424D 

如果你用16进制编辑器打开一个文件,它的开头不是FFD8FF,那就不是jpg文件。这个魔数一般会在相关文件标准中进行规定,所有人都要遵守。

延伸阅读

如何避免magic number

为避免因“Magic Number”造成的问题,可以通过引入常量、枚举及其他宏定义等方式来减少硬编码的数字的使用,使代码更加灵活、易读和维护。同时,还可以通过编写注释来解释“Magic Number”的含义,从而帮助开发人员更好地理解它们的作用。

文章标题:为什么算法中会出现magic number,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/49370

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Z, ZLWZ, ZLW认证作者
上一篇 2023年4月15日
下一篇 2023年4月15日

相关推荐

  • 什么python编程

    什么是Python编程? Python是一种高级编程语言,它由Guido van Rossum于1989年底发明,并在1991年首次发布。这种语言的一个突出特点是它的高读性,以及它让程序员能够用几行代码表达想法的能力,这是由它的简单易学的语法和高层次的数据结构支持的。具体来讲,Python的一个关键…

    2024年5月1日
    1600
  • 敏捷开发中如何管理项目进度

    敏捷开发中管理项目进度需要明确项目目标和范围、制定初步的项目计划、迭代式开发、优先级排序和任务分配、持续沟通和协作、风险管理、持续改进和调整、利用工具和技术、培养团队能力和关注质量等。详细介绍:1、明确项目目标和范围,在项目开始之前,与利益相关者进行充分的沟通和协商,明确项目的目标、范围和预期成果;2、制定初步的项目计划,利用历史数据和经验等等。

    2023年10月23日
    49600
  • 数据挖掘用什么编程语言好

    Python、Java和R语言是数据挖掘中使用最为广泛的编程语言。其中,Python 由于其简单易学、丰富的数据分析库以及强大的社区支持,在数据挖掘领域中占有重要的地位。Python提供了像Pandas、NumPy、Scikit-Learn等库,它们为数据处理、统计分析和机器学习提供了极大的便利。P…

    2024年4月27日
    3700
  • 质监站如何管理试验室项目

    质监站管理试验室项目主要包括确立明确的管理体系、制定和执行严格的质量控制措施、进行有效的人员培训、实施设备和仪器的定期校准及维护、保障信息和数据的安全以及定期进行内部和外部审计。核心在于构建一个全面的、系统的和持续改进的质量管理框架,尤其是制定和执行严格的质量控制措施,这是确保试验结果准确性和可靠性…

    2024年4月11日
    6200
  • 什么叫matlab编程

    MATLAB编程是指使用MATLAB语言和环境开发软件应用程序和算法的过程。MATLAB,代表矩阵实验室(Matrix Laboratory),是由MathWorks公司开发的一种高性能语言和交互式环境,专为工程师和科学家进行数值计算、可视化以及编程而设计。1、 它提供了一个高级编程环境,用于算法开…

    2024年5月2日
    1000
  • 学编程的第一份工作是什么

    学习编程后的第一份工作可能是1、实习生、2、初级软件开发工程师、3、测试工程师之一。初级软件开发工程师在这些角色中备受新手程序员的青睐。作为初级开发者,你将有机会应用在学习过程中获得的理论知识来解决实际问题,同时也能在实践中继续学习和成长。你的主要职责可能包括编写简单的代码来实现软件功能、修复一些基…

    2024年4月30日
    2800
  • 什么是上机编程

    上机编程是编程过程中的一部分,涉及编写、测试和修改代码。其中一点是编写代码时,程序员需要考虑算法效率、代码的可读性以及是否遵守编码标准,这不仅有助于后续的维护工作,也能提高程序的运行效率。有效的代码编写需要识别程序目标,选择恰当的编程语言,利用适当的编程工具和集成开发环境(IDE)来构建应用程序。编…

    2024年5月2日
    900
  • 企业为什么要进行需求管理

    企业进行需求管理的原因主要有:1、需求变更频繁;2、提升产品质量;3、提高团队效率;4、避免资源浪费;5、提升客户满意度;6、适应市场变化。需求管理能帮助企业更好地跟踪和管理这些变更,确保项目按照预定的方向和进度进行。 1、需求变更频繁 企业在产品研发或项目实施过程中,需求的变更往往非常频繁。需求管…

    2023年7月16日
    42700
  • api编程是什么

    API编程是一种允许软件应用之间交互的技术方法。其核心在于,1、它提供了一组规则和协议,2、它允许不同软件产品或组件之间通讯,3、它极大地促进了开发过程中的模块化和复用。特别地,第1点从根本上改变了开发者构建和整合不同系统的方式。举例来说,当开发一个需要从社交媒体平台获取用户信息的应用时,通过使用该…

    2024年5月2日
    1200
  • 代码编程用什么

    编程语言的选择取决于3个关键因素:项目需求、开发效率、生态系统支持。 考虑到这些因素,Python 在许多情况下成为首选,尤其是对于数据科学、机器学习和初学者。Python的简洁语法和强大的标准库使它成为进入编程世界的理想选择。此外,Python 拥有庞大的社区和丰富的第三方库,这意味着开发者可以找…

    2024年5月2日
    900

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部