gpt4 book ai didi

java - 在 Java 中将两个大数相乘时避免数字极性反转的最佳方法

转载 作者:行者123 更新时间:2023-12-02 09:49:20 25 4
gpt4 key购买 nike

我的问题与此相关 How can I check if multiplying two numbers in Java will cause an overflow?

在我的应用程序中,x 和 y 是动态计算的,并且在我的公式中的某个位置我必须将 x 和 y 相乘。

     int x=64371;
int y=64635;

System.out.println((x*y));

我得到错误的输出:-134347711

我可以通过将变量 xy 从类型 int 更改为 long 来快速修复上述问题并得到上述案例的正确答案。但是,无法保证 xy 的增长不会超过 long 的最大容量。

问题

  1. 为什么我在这里得到一个负数,即使我没有将最终结果存储在任何变量中? (出于好奇)

  2. 由于我无法提前知道 x 和 y 的值,是否有更快的方法来避免这种溢出。也许将所有 x 和 y 除以整个应用程序运行的某个大常量,或者我应该在将 x 和 y 相乘之前取 x 和 y 的 log ? (实际问题)

编辑:

澄清

该应用程序在大数据集上运行,需要数小时才能完成。如果有一个不太慢的解决方案就更好了。

由于最终结果用于比较(它们只需要与原始结果成一定比例),如果最终值存在巨大的+-5% 误差,那么这是可以接受的性能提升。

最佳答案

如果您知道数字可能很大,请使用 BigInteger 反而。这保证不会溢出,然后您可以检查结果是否太大而无法放入 intlong ,或者您可以只使用 BigInteger直接值。

BigInteger是一个任意精度的类,因此它会比使用直接原始值(可能存储在处理器寄存器中)慢,因此请弄清楚您是否真的会溢出 long ( int 乘以 int 将始终适合 long ),然后选择 BigInteger如果您的域确实需要它。

关于java - 在 Java 中将两个大数相乘时避免数字极性反转的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19434800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com