目前在我的java程序中面临一个意想不到的问题。我必须对数字进行多次算术运算(这是双精度数),我看到双数组中出现无穷大值。
反转问题表明,做一个非常小的双变量的平方给出了无限的结果:
// Value of a = 4.8484439536882894E154
double b = a*a; // Math.pow(a,2) give the same result
理解如下操作:
double b = a/0.0;
会给我一个无限的结果,但在这里,我希望看到零,我很困惑。
我看到两种方法来解决这个问题:
我主要担心的是我有效率限制(我做了很多操作),我想知道最有效的解决方案
发布于 2018-09-25 14:32:19
做一个非常小的双变量的平方给出了无限的结果: a = 4.8484439536882894E154
这不是一个小的价值,而是一个非常大的价值。此值的平方值超出了可以存储在double中的值。我会避免在真正的程序中使用这么大的数字。使用BigDecimal时,这将无法有效处理,除非您小心精度,否则该值可能会占用大量内存。
BigDecimal bd = new BigDecimal(4.8484439536882894E154);
System.out.println(bd);
System.out.println(bd.multiply(bd));
版画
48484439536882894125356714897804823013264499883293252029671138397867940846580091139322609929685416472654290189475072478947606359471429750280124877227687936
2350740877205653148971873997825006119631878893922089422541052262471645204316961966715674184915401562416803366985802237579003549878341534545604693618995320178663111929136318299969099169324414379507555742403529385887319157122566620560154172317174133197671834101629503331734475801299228334819239184609540199940096
如果你真的需要大数字,会以对数标度存储数据
double logA = Math.log10(4.8484439536882894E154);
System.out.println(logA);
double logA2 = 2 * logA;
System.out.println(logA2);
版画
154.6856023796833
309.3712047593666
https://stackoverflow.com/questions/-100002723
复制相似问题