Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
vue中在父组件点击按钮触发子组件的事件
1、父组件的button元素绑定click事件,该事件指向notify方法 2、给子组件注册一个ref=“child” 3、父组件的notify的方法在处理时,使用了$refs.child把事件传递给子组件的parentMsg方法,同时携带着父组件中的参数msg 4、子组件接收到父组件的事件后,调用了parentMsg方法,把接收到的msg放到message数组中
江一铭
2022/06/16
6.5K0
vue.js 父组件如何触发子组件中的方法
组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用 is 特性进行了扩展的原生 HTML 元素。
IT工作者
2022/02/17
4.8K0
vue 父组件调用子组件的函数_vue子组件触发父组件方法
项目里将element-ui的el-upload写成公共组件方便调用,官方的before-upload方法用于处理上传前要做的事,如:比较文件大小,限制文件类型等,通过返回true 或 false 控制是否上传。 当该组件调用父组件方法,并且要能获取到父组件方法的返回值,如何实现?
全栈程序员站长
2022/11/10
3K0
vue子组件传值给父组件_子组件调用父组件中的方法
大家好,又见面了,我是你们的朋友全栈君。 参考视频 : https://www.bilibili.com/video/av32790541/?spm_id_from=trigger_reload 原
全栈程序员站长
2022/10/04
4.3K0
vue子组件传值给父组件_子组件调用父组件中的方法
Vuejs中父组件主动调用子组件的方法
我们都知道,vue是单向流,但是有时候我们需要在父组件中主动通知子组件一些信息,使其做出一些响应变化,那么如何在父组件中去主动调用子组件的方法呢?Vue当然给我们提供了方法,如下:
飞奔去旅行
2019/06/13
5.1K0
Vue父组件调用子组件事件
Vue父组件向子组件传递事件/调用事件 不是传递数据(props)哦,适用于 Vue 2.0 方法一:子组件监听父组件发送的方法 方法二:父组件调用子组件方法 子组件: export default { mounted: function () { this.$nextTick(function () { this.$on('childMethod', function () { console.log('监听成功') })
大鹅
2021/06/11
7490
Vue父组件与子组件传递事件/调用事件
如上:通过this.$emit()来触发父组件的方法。具体就是子组件触发$emit绑定的事件watchChild,然后父组件监听watchChild,一旦watchChild被触发便会触发父组件的parentReceive方法。
IT工作者
2022/02/17
3.5K0
输入框在输入中文时回车误触发输入的回车事件
这个问题出现在:chatx.me的输入框 最近反应的人比较多,然后还是问了下前前端同事,解决了。
SingYi
2023/08/23
3500
阻止中文输入时触发input事件
做限制输入框可输入最大的长度和实时匹配输入框数据时遇到了坑 —— 当中文输入时input事件也会被触发,即假设限制的是2个字符,你要输入社会人的“社(she)”,就会直接被截取,输入框填充文本sh。或者是在中文输入法时也会一直去调接口,匹配数据,影响了页面的性能!代码如下:
全栈程序员站长
2022/09/01
1.2K0
vue 父组件调用子组件的方法_vue子组件修改父组件值
我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法
全栈程序员站长
2022/11/09
2.1K0
React父组件调用子组件的方法
React组件化开发中子组件可以通过传递变量或者父组件的方法来实现和父组件的通信或者调用函数传值,但是父组件如何调用子组件的方法呢?很多介绍Hooks的文章并没有讲到useImperativeHandle,我以使用React18+TypeScript开发的项目为例,组件使用Hooks。以下是我精简过后的代码。
用户6256742
2022/07/06
5.8K0
Vue子组件调用父组件的方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
2.2K0
子组件派发事件和值给父组件
父组件通过v-on绑定子组件派发的事件,并触发一个新的事件,新的事件内可以接收传来的值
小小杰啊
2022/12/21
3040
vue父组件引入子组件_vue子组件传递方法给父组件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.1K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
我们经常分不清什么是父组件,什么是子组件。现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件。具体代码如下
全栈程序员站长
2022/09/19
7.1K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
vue父组件调用子组件方法
抱怨身处黑暗,不如提灯前行。——刘同 首先是官方文档 这里使用ref属性去访问子元素 <hello-world ref="helloWorld" msg="Hello World"></hello-world> 然后打印一下 console.log(this.$refs.helloWorld); 可以看到成功获取到 再到子组件定义一个方法: 父组件访问: 效果:
阿超
2022/08/17
1.8K0
vue父组件调用子组件方法
vue子组件调用父组件方法
强迫学习的东西是不会保存在心里的。——《柏拉图论教育》 首先我们在子组件中这样定义 <template> <div> <el-button @click="callSuper">123</el-button> </div> </template> <script> export default { methods: { callSuper() { this.$emit('parentEvent', '我的'); } } }; </script> 这里的组件就只有一个el-
阿超
2022/08/16
2.1K0
vue子组件调用父组件方法
input输入中文时,拼音触发input事件
在上一篇文章中写到了函数防抖,在使用函数防抖来进行搜索框优化的时候会遇到一个问题,就是监听文本输入框的input事件,在拼写汉字(输入法)但汉字并未实际填充到文本框中时会触发input事件,会出现下图的效果
OECOM
2020/07/01
8.3K1
vue父组件调用子组件方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
2.6K0
vue父组件中获取子组件中的数据
<FormItem label="上传头像" prop="image"> <uploadImg :width="150" :height="150" :name="'avatar'" size="150px*150px" ref="avatar"></uploadImg> </FormItem> <FormItem label="上传营业执照" prop="businessLicence"> <uploadImg :width="350" :heigh
蓓蕾心晴
2018/04/12
7K0

相似问题

触发父组件父节点方法的子组件输出事件

38

监听VueJs中父组件触发的事件

110

如何从角2中的子组件事件触发父组件中的局部引用?

25

子组件中父组件的触发方法-- react

14

角键事件不会在子组件上触发,而只在父组件上触发。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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