首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java幂函数答案

Java幂函数答案
EN

Stack Overflow用户
提问于 2018-06-09 07:20:37
回答 2查看 91关注 0票数 1

我正在编写我自己的权力函数实现,我发现了一些在Integer.MAX_VALUE周围发生的奇怪结果,我不知道为什么会发生这些结果。这就是我的实现:

代码语言:javascript
运行
AI代码解释
复制
public static long power(long x, long y) {
    int result = 1;
    while (y > 0) {
        if ((y & 1) == 0) {
            x *= x;
            y >>>= 1;
        } else {
            result *= x;
            y--;
        }
    }
    return result;
}

运行以下代码,

代码语言:javascript
运行
AI代码解释
复制
System.out.println(fastPower(2, 31));
System.out.println(Math.pow(2, 31);
System.out.println((long)Math.pow(2, 31));
System.out.println((int)Math.pow(2, 31));

结果如下,我不明白。

代码语言:javascript
运行
AI代码解释
复制
-2147483648
2.147483648E9
2147483648
2147483647

这进一步使我在使用shorts时感到困惑:

代码语言:javascript
运行
AI代码解释
复制
System.out.println(fastPower(2, 15));
System.out.println(Math.pow(2, 15));
System.out.println((int)Math.pow(2, 15));
System.out.println((short)Math.pow(2,15));

32768
32768.0
32768
-32768

这些都是我所期望的答案,但它们似乎与int的结果不一致。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-09 08:15:19

intshort的前三个输出很容易解释:

代码语言:javascript
运行
AI代码解释
复制
-2147483648 // your method returns an int, so overflows
2.147483648E9 // Math.pow returns a double, so formatted like this
2147483648 // double casted to a long, 2147483648 inside the possible range for long

32768 // your method returns an int, 32768 is inside the possible range for int
32768.0 // Math.pow returns a double, so formatted like this
32768 // double casted to an int, 32768 is inside the possible range for int

难以解释的是第四个结果。System.out.println((int)Math.pow(2, 31));不也应该打印-2147483648吗?

这里的诀窍是Java如何实现从doubleint的转换。根据规范,这称为收缩原语转换(第5.1.3节):

22对原语类型的特定转换称为缩窄原语转换:

  • 短到字节或字符
  • 字符到字节或短字符
  • int到字节、短或字符
  • 长到字节、短、字符或int
  • 浮动到字节、短、字符、int或长
  • 双字节,短,字符,int,长或浮点

这就是如何执行doubleint的转换(由我用粗体表示):

在第一步中,浮点数被转换成一个长的,如果T是长的,或者一个int,如果T是字节、短、字符或int,如下所示:

  • 如果浮点数为NaN(§4.2.3),则转换的第一步结果是int或长0。
  • 否则,如果浮点数不是无穷大,则浮点值被舍入整数值V,使用IEEE 754向零模式(§4.2.3)四舍五入。然后有两种情况:

如果T是长的,并且这个整数值可以表示为长,那么第一步的结果是长值V.b。否则,如果这个整数值可以表示为int,那么第一步的结果就是int值V。

  • 否则,以下两种情况中的一种必须为真: a。该值必须太小(一个较大的负值或负无穷大),并且第一步的结果是int或long类型的最小可表示值。b.值必须太大(一个大的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。
代码语言:javascript
运行
AI代码解释
复制
1. In the second step:

  • 如果T为int或长,则转换的结果是第一步的结果。
  • 如果T是字节、字符或短,则转换结果是第一步的结果的缩窄转换为T (§5.1.3)类型的结果。

第一步将double更改为int - 2147483647的最大可表示值。这就是为什么在int中,2147483647被打印出来的原因。在short情况下,第二步将int值2147483647更改为short,如下所示:

缩小符号整数到整型T的转换只会丢弃除n个最低阶位外的所有比特,其中n是用来表示T型的位数。

这就是为什么short飞越,但int没有!

票数 0
EN

Stack Overflow用户

发布于 2018-06-09 08:15:41

假设power()fastPower()是相同的,则fastPower(2, 31)返回-2147483648,因为result变量是int,尽管参数和返回类型都是long

Math.pow()返回一个double,因此将结果转换为整数类型(longintshortbytechar)遵循下面引用的JLS 5.1.3.缩窄本原转换规则。

Math.pow(2, 31)2147483648.0。当转换为long时,它的值是相同的,即2147483648。然而,当转换为int时,值太大,因此结果是Integer.MAX_VALUE,即2147483647,如下面引号中所强调的那样。

Math.pow(2, 15)32768.0。当转换为int时,它的值是相同的,即32768。然而,当转换到short时,值首先缩小到int,然后通过丢弃更高的位(参见下面的第二个引号)缩小到short,从而导致数字溢出到-32768

将浮点数转换为整型T的缩窄转换需要两个步骤:

  1. 在第一步中,如果T是int,,则将浮点数转换为long,如果T为byteshortcharint,则将转换为long,如下所示:
代码语言:javascript
运行
AI代码解释
复制
- If the floating-point number is NaN ([§4.2.3](https://docs.oracle.com/javase/specs/jls/se10/html/jls-4.html#jls-4.2.3)), the result of the first step of the conversion is an `int` or `long` `0`.
- Otherwise, if the floating-point number is not an infinity, the floating-point value is rounded to an integer value `V`, rounding toward zero using IEEE 754 round-toward-zero mode ([§4.2.3](https://docs.oracle.com/javase/specs/jls/se10/html/jls-4.html#jls-4.2.3)). Then there are two cases:
代码语言:javascript
运行
AI代码解释
复制
    1. If T is `long`, and this integer value can be represented as a `long`, then the result of the first step is the `long` value `V`.
    2. Otherwise, if this integer value can be represented as an `int`, then the result of the first step is the `int` value `V`.

代码语言:javascript
运行
AI代码解释
复制
- Otherwise, one of the following two cases must be true:
代码语言:javascript
运行
AI代码解释
复制
    1. The value must be too small (a negative value of large magnitude or negative infinity), and the result of the first step is the smallest representable value of type `int` or `long`.
    2. **The value must be too large (a positive value of large magnitude or positive infinity), and the result of the first step is the largest representable value of type** **`int`** **or** **`long`****.**

  1. 在第二步:
代码语言:javascript
运行
AI代码解释
复制
- If T is `int` or `long`, the result of the conversion is the result of the first step.
- If T is `byte`, `char`, or `short`, the result of the conversion is the result of a narrowing conversion to type T ([§5.1.3](https://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.1.3)) of the result of the first step.

将有符号整数转换为整数类型T只会丢弃除n个最低阶位之外的所有位数,其中n是用来表示T型的位数,除了可能丢失关于数值大小的信息外,这还可能导致结果值的符号与输入值的符号不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50775768

复制
相关文章
Java面试分享(题目+答案)
1.说下Struts的设计模式 MVC模式: web应用程序启动时 就会加载并初始化ActionServler。 用户提交表单时, 一个配置好的ActionForm对象被创建, 并被填入表单相应的数据, ActionServler根据Struts-config.xml文件 配置好的设置决定是否需要表单验证, 如果需要就调用ActionForm的Validate() 验证后选择将请求发送到哪个Action, 如果Action不存在, ActionServlet会先创建这个对象, 然后调用Action的exe
Java高级架构
2018/12/18
1.3K0
java笔试题大全带答案_java笔试题大全带答案(经典11题)[通俗易懂]
java.lang.reflect.Constructor类的newInstance()实例方法。
全栈程序员站长
2022/06/24
6260
幂函数拟合报错及解决办法
问题描述 采用MATLAB、Python对数据拟合时(函数形式如y=1-c*exp(k*x^t)),程序有时能够完美运行,给出你想要的结果,然而有时候竟然报错,运行不出结果,或者给出的结果明显不对,让你时常怀疑电脑是不是中病毒了,😅,为什么交给电脑同样的任务(拟合求参数),电脑还需要根据自身心情来决定是否给你想要的结果? 昨天,硕士好友王博士同样也遇见这个问题,现分析其具体原因?于此同时,针对疲劳裂纹扩展具体的工程问题,对最小二乘法拟合(疲劳裂纹扩展速率以及应力强度因子)实验数据的基本过程进行简要介绍,具体
联远智维
2022/01/20
7630
幂函数拟合报错及解决办法
Core Java 52 问(含答案)
上篇文章 4.9k Star 安卓面试知识点,请收下! 翻译了 Mindorks 的一份超强面试题,今天带来的是其中 Core Java部分 52 道题目的答案。题目的质量还是比较高的,基本涵盖了 Java 基础知识点,面向对象、集合、基本数据类型、并发、Java 内存模型、GC、异常等等都有涉及。整理答案的过程中才发现自己也有一些知识点记不太清了,一边回忆学习,一边整理答案。52 道题,可以代码验证的都经过我的验证,保证答案准确。
路遥TM
2021/08/31
3830
java面试题及答案2021,java2021最新面试题及答案
String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true 代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
一诺千金
2021/03/21
1.1K0
Java SSM 框架面试,附答案!!!
作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。
好好学java
2019/10/22
1.2K0
Java SSM 框架面试,附答案!!!
Java 面试都只是背答案不
如果是理解了,哪怕不是完全正确,甚至表达和设计上面都有问题,这种情况与机械的背答案是 2 回事。
HoneyMoose
2021/08/09
2830
Java 面试都只是背答案不
JAVA 中级面试题 (附答案)
1. HashMap,LinkedHashMap,TreeMap都属于Map。
全栈程序员站长
2022/07/02
1.4K0
Java基础面试题及答案
Java是支持并发,基于类的以及面向对象的一种计算机编程语言. 以下列举了面向对象编程的优势:
用户7886150
2021/02/01
9100
Java面试题及答案解析
Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:
yaohong
2019/09/11
9440
java笔试题及答案最新(net面试题及答案2020)
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。
全栈程序员站长
2022/07/31
1.2K0
java笔试题及答案最新(net面试题及答案2020)
java基础练习题(含答案)[通俗易懂]
int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为:
全栈程序员站长
2022/09/08
9790
Java测试题及答案(Java干货完整试卷)
都是一些非常非常基础Java入门学习的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,但是IT公司就喜欢考这些基础的东西,所以为了能进大公司就~~~当复习期末考吧。花了不少时间整理,在整理过程中也学到了很多东西,请大家认真对待每一题~~~
全栈程序员站长
2022/09/15
1.4K0
Java测试题及答案(Java干货完整试卷)
接口测试面试题及答案(最新java面试题及答案)
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
全栈程序员站长
2022/08/02
1K0
接口测试面试题及答案(最新java面试题及答案)
LeetCode刷题DAY 14:x的n次幂函数
虽然编程语言中都有现成的幂运算符号,但这道题目要求我们自己写一个完成该功能的函数。x的n次幂,就是n个x相乘,可以通过for循环实现该目的,时间复杂度为O(N),如何把时间复杂度降到O(logN),是该题重点。
三猫
2020/05/22
1.5K0
Java多线程面试问题和答案
访中,我们通常会遇到两个主题: java采集问题 和多线程面试问题。多线程是关于并发和线程的。这是很好的准备,所以不要离开这个话题。我们正在共享重要的java多线程面试问题和答案。
马士兵的朋友圈
2020/09/08
7870
Java笔试真题及参考答案
(1)窗口标题为“GUI程序”,大小为400X300, 居中显示:窗口上有一个面板,面板背景色为灰色;
万猫学社
2022/04/22
5600
Java笔试真题及参考答案
《LeetCode刷题Java版答案》pdf来了
很多朋友在后台留言说,刷LeetCode上的数据结构+算法题时难免会遇到困难,想要找一本答案题解做参考。
五分钟学算法
2021/05/07
6.4K0
最新Java高薪面试题+答案+解析!
今天老九君给大家分享一些Java面试需要的题目哟~ 01 anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interfac
老九君
2018/03/06
1.2K0
Java线程面试题合集(含答案)
作者:阿呆变Geek 来源:jianshu.com/p/a53e1d01adde 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档: 《Java核心技术 卷一》 Java线程面试题 Top 50:http://www.importnew.com/12773.html JAVA多线程和并发基础面试问答: http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 1
Tanyboye
2018/07/02
8240

相似问题

递归幂函数给出了奇怪的答案

20

幂函数指数JOptionPane java

12

带递归的幂函数- java

20

Java中使用递归的幂函数

10

Java副本(?)答案

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档