高精度

【讲古堂】高精度四则运算加减乘除(提高篇)

眉间皱痕 提交于 2019-12-04 22:05:50
入门篇: http://my.oschina.net/dubenju/blog/637181 参照代码: http://git.oschina.net/dubenju/encv/blob/master/src/java/javay/math/BigNum.java?dir=0&filepath=src%2Fjava%2Fjavay%2Fmath%2FBigNum.java&oid=017e78be758e0fc6e8c1aea739591da1ab1dba96&sha=02ccd7b19bb3614e88ab3e150ef5d5d95347b04a 加减法没有什么特别的,不再多说。 针对乘法有以下算法: karatsuba Toom-cook3 Lagrange插值 FFT Schonhage strassen 除法有 以 下算法: Knuth算法D BurnikelZiegler(1998年) https://cr.yp.to/bib/1998/burnikel.ps 完。 来源: oschina 链接: https://my.oschina.net/u/660460/blog/644257

Java中解决浮点数精度的问题

夙愿已清 提交于 2019-11-27 18:18:38
问题描述 在项目中用Java做浮点数计算时,发现对于4.015*100这样的计算,结果不是预料中的401.5,而是401.49999999999994。如此长的位数,对于显示来说很不友好。 问题原因:浮点数表示 查阅相关资料,发现原因是:计算机中的浮点数并不能完全精确表示。例如,对于一个double型的 38414.4 来说,计算机是这样存储它的: 转成二进制:1001011000001110.0110011001100110011001100110011001100 转成科学计数法:1.0010110000011100110011001100110011001100110011001100×2^15 double型编码格式是这样的: double 符号位1位 阶码11位 尾数52位 符号位:正数统一是0 阶码:15是正数,因此最高位是1,最低位减1,为10000001110 尾数:去掉最高位默认的1,为0010110000011100110011001100110011001100110011001100 组合起来,最终得到的编码是:0 10000001110 0010110000011100110011001100110011001100110011001100 从这里可以看出来,主要原因在于二进制编码使得小数部分无法完全精确表示,例如0.4 = 0.25 + 0.125 +