您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java Math 类下全是数学知识,比如这个源码都看不懂!

时间:2023-01-13 15:22:30  来源:今日头条  作者:小傅哥

作者:小傅哥
博客:https://bugstack.cn - 包含: JAVA 基础,面经手册.NETty4.x,手写Spring,用Java实现JVM,重学Java设计模式,SpringBoot中间件开发,IDEA插件开发,DDD系统架构项目开发,字节码编程...

 

沉淀、分享、成长,让自己和他人都能有所收获!
一、前言

 

不知道读者伙伴用了那么久的 Java Math 函数,是否有打开它的源码,看看是如何实现的。比如 Math.pow 函数计算数字的次方值,只要你打开它的源码,你会惊讶到;这在弄啥,这都是啥,这要干啥!


 

这是啥,这就是一段用于计算次方的算法。简单来说,它是通过在 Math.pow 中预先构建了一个基于查表的算法,保存了常用的幂的值,然后使用这些值来快速计算幂次方。

其实用于计算次幂的方法还有很多,包括;递归、滑动窗口(Sliding-window method)、蒙哥马利的梯子技术(Montgomery's ladder technique)、固定底数(Fixed-base exponent)等方式来计算。接下来小傅哥就给大家分享下这些算法方案。

二、算法实现

其实无论是那样一种计算次幂的方式,都离不开核心的基础模型。也就是说,任何一个数的次幂,都是这个次幂下数字的乘积累计值。包括使用递归、还是通过二进制数字移位,最终都要归到幂的乘积。


 

 

  • 这里举例了2^4次幂递归计算和2^10次幂使用二进制移位。
  • 接下来我们可以看下具体的代码实现。
1. 递归 public static double pow01(double base, double power) { if (power == 0) { return 1; } if (power % 2 == 0) { double multiplier = pow01(base, power / 2); return multiplier * multiplier; } double multiplier = pow01(base, Math.floor(power / 2)); return multiplier * multiplier * base; }
  • 把次方数不断的通过除2递归,计算乘积值。就和上图中的左面部分逻辑一致。
2. 滑动窗口 public static long pow03(int base, int exponent) { if (exponent == 0) { return 1; } if (exponent == 1) { return base; } long result = 1; long window = base; while (exponent > 0) { if ((exponent & 1) == 1) { result *= window; } window *= window; exponent >>= 1; } return result; }
  • 滑动窗口法是一种用于在一个数列中查找满足某些条件的子序列的算法。它的基本思路是,使用一个指针指向子序列的左端点,然后通过不断移动这个指针来扩展子序列的右端点,直到找到满足条件的子序列为止。
3. 蒙哥马利的梯子技术 public static BigInteger pow04(BigInteger x, BigInteger n) { BigInteger x1 = x; BigInteger x2 = x.multiply(x); for (int i = n.bitLength() - 2; i >= 0; i--) { if (n.TestBit(i)) { x1 = x1.multiply(x2); x2 = x2.multiply(x2); } else { x2 = x1.multiply(x2); x1 = x1.multiply(x1); } } return x1; }
  • 蒙哥马利的梯子技术(Montgomery's ladder technique)是一种在密码学中计算幂次方的算法。它的基本思路是通过不断地进行二次求幂运算来计算高次幂。
  • 蒙哥马利的梯子技术需要使用 BigInteger 类型的数据进行计算。BigInteger 类是 Java 中的一个用于处理任意精度整数的类。
4. 固定底数 public static BigInteger pow05(BigInteger base, BigInteger exponent) { int e = exponent.intValue(); BigInteger result = BigInteger.ONE; BigInteger current = base; while (e > 0) { if ((e & 1) == 1) { result = result.multiply(current); } current = current.multiply(current); e >>= 1; } return result; }
  • 固定底数指数法(Fixed-base exponentiation)是一种用于快速计算幂次方的算法。它的基本思路是使用预先计算的幂的表来减少求幂的次数。
三、测试验证 @Test public void test_FastPowering() { System.out.println("测试结果:" + FastPowering.pow01(2, 4)); System.out.println("测试结果:" + FastPowering.pow02(2, 10)); System.out.println("测试结果:" + FastPowering.pow03(2, 4)); System.out.println("测试结果:" + FastPowering.pow04(BigInteger.valueOf(2), BigInteger.valueOf(10))); System.out.println("测试结果:" + FastPowering.pow05(BigInteger.valueOf(2), BigInteger.valueOf(10))); }

 

测试结果


测试结果:16.0 测试结果:1024 测试结果:16 测试结果:1024 测试结果:1024 Process finished with exit code 0

  • https://en.wikipedia.org/wiki/Exponentiation_by_squaring


Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作者:小傅哥 博客:https://bugstack.cn - 包含: Java 基础,面经手册,Netty4.x,手写Spring,用Java实现JVM,重学Java设计模式,SpringBoot中间件开发,IDEA插件开发,DDD系统架构项目开发,字...【详细内容】
2023-01-13  Tags: Java  点击:(0)  评论:(0)  加入收藏
本文讨论了对 HTML 代码可视化文档的需求,并提供了一个免费的 API 解决方案,可将 HTML 字符串转换为 PNG 屏幕截图。 自 20 世纪 80 年代后期的构想以来,超文本标记语言 (HTML)...【详细内容】
2022-12-21  Tags: Java  点击:(26)  评论:(0)  加入收藏
1. Spring注入有四种方式:· set注入这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然...【详细内容】
2022-11-15  Tags: Java  点击:(6)  评论:(0)  加入收藏
一、ssh登录服务器1、在终端(这里的终端版本我使用的是 SecureCrt-8.5.4)中输入连接命令ssh root@[ipaddress]。您需要将其中的 ipaddress 替换为您的服务器的公网IP地址。例...【详细内容】
2022-11-14  Tags: Java  点击:(182)  评论:(0)  加入收藏
理解锁的基础知识如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。基础知识之一:锁的类型按照其性质分类1)公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来...【详细内容】
2022-11-09  Tags: Java  点击:(6)  评论:(0)  加入收藏
本文将介绍接下来的技巧和主题: 在包装器上使用基元字段(例如,布尔值 ->布尔值) 减少形成平面结构的类的数量(在一个或多个类中折叠类) 尽可能使用窄数据类型(例如,代替,代替等)short...【详细内容】
2022-11-02  Tags: Java  点击:(130)  评论:(0)  加入收藏
导读:在 Kubernetes 中运行无服务器函数时,实现更快的启动速度和更小的内存占用。本文字数:5814,阅读时长大约: 7分钟由于运行上千个应用程序容器荚(Pod)所耗费的资源多,令它实现...【详细内容】
2022-10-26  Tags: Java  点击:(34)  评论:(0)  加入收藏
在项目开发中,后端服务对外提供API接口一般都会关注响应时长。但是某些情况下,由于业务规划逻辑的原因,我们的接口可能会是一个聚合信息处理类的处理逻辑,比如我们从多个不同的...【详细内容】
2022-10-26  Tags: Java  点击:(58)  评论:(0)  加入收藏
1、原理:基于javaAgent和Java字节码注入技术的java探针工具技术原理 2、原理分析动态代理功能实现说明,我们利用javaAgent和ASM字节码技术开发java探针工具,实现原理如下:jdk1.5...【详细内容】
2022-10-24  Tags: Java  点击:(134)  评论:(0)  加入收藏
JVM 内存有以下区域: Young Generation Old Generation Metaspace Others region 图:JVM 内存区域 要查看哪些对象存储在哪个区域,您可以参考此视频剪辑。有时您的应用程序...【详细内容】
2022-10-04  Tags: Java  点击:(61)  评论:(0)  加入收藏
▌简易百科推荐
作者:小傅哥 博客:https://bugstack.cn - 包含: Java 基础,面经手册,Netty4.x,手写Spring,用Java实现JVM,重学Java设计模式,SpringBoot中间件开发,IDEA插件开发,DDD系统架构项目开发,字...【详细内容】
2023-01-13  小傅哥  今日头条  Tags:Java   点击:(0)  评论:(0)  加入收藏
Java是一门面向对象的编程语言,具有功能强大和简单易用两个特征。由于Java可以应用于桌面应用程序、Web应用程序以及分布式系统和嵌入式系统等应用程序等,应用范围十分广泛,所...【详细内容】
2023-01-05  好程序员IT教育    Tags:Java要   点击:(10)  评论:(0)  加入收藏
随着Java程序员的薪资水涨船高,很多人想要转行从事Java开发工作,但又不知道应该按照什么路线进行学习,今天“好程序员”就来为大家分享一些Java入门教程大纲,非常适合零基础的同...【详细内容】
2023-01-04  好程序员IT教育    Tags:Java   点击:(13)  评论:(0)  加入收藏
什么是RUNNABLE?直接看它的 Javadoc 中的说明: 一个在 JVM 中执行的线程处于这一状态中。(A thread executing in the Java virtual machine is in this state.) 而传统的进(线)程...【详细内容】
2023-01-03  Java精选     Tags:Java   点击:(19)  评论:(0)  加入收藏
前言据说这个功能最近在抖音上很火,我没有抖音,没有看到。 但是我在掘金和CSDN上看了,相关案例确实很多,但是大家都是借助于了微信服务号,在我看来,效果很不佳。其实我原来的初衷...【详细内容】
2022-12-24  穆雄雄  稀土掘金  Tags:Java   点击:(14)  评论:(0)  加入收藏
日常办公和软件开发除了可以使用Windows系统以外,还可以使用macOS系统,至于具体使用什么系统取决于你入职公司之后公司给你发的什么电脑,如果是MacBookPro那么就使用macOS开...【详细内容】
2022-12-23  ittirneline  今日头条  Tags:Java   点击:(26)  评论:(0)  加入收藏
[限流基本概念] [限流方案常用算法] [常用的限流方案] [从架构维度考虑限流设计] [具体的实现限流的手段] [限流基本概念] 对一般的限流场景来说它...【详细内容】
2022-12-22     IT架构师联盟   Tags:Java   点击:(7)  评论:(0)  加入收藏
本文讨论了对 HTML 代码可视化文档的需求,并提供了一个免费的 API 解决方案,可将 HTML 字符串转换为 PNG 屏幕截图。 自 20 世纪 80 年代后期的构想以来,超文本标记语言 (HTML)...【详细内容】
2022-12-21   qaseven   网易号  Tags:Java   点击:(26)  评论:(0)  加入收藏
我们在日常开发中,经常会用到一个系统需要链接多个数据库来实现业务的需求,比如多个系统之间数据调用、两个数据之间同步等等。今天给大家分享使用Hutool-db实现多数据源配...【详细内容】
2022-12-19  IT技术分享社区  今日头条  Tags:hutool-db   点击:(33)  评论:(0)  加入收藏
问题Java并发情况下总是会遇到各种意向不到的问题,比如下面的代码:int num = 0;boolean ready = false;// 线程1 执行此方法public void actor1(I_Result r) { if(ready) { r...【详细内容】
2022-12-05  JAVA旭阳  今日头条  Tags:JAVA   点击:(32)  评论:(0)  加入收藏
站内最新
站内热门
站内头条