Java 预测乘法的位数

Java 预测乘法的位数,java,math,mathematical-optimization,multiplication,Java,Math,Mathematical Optimization,Multiplication,我需要找到非常大的乘法的位数(每个大约300位数)。我想知道是否有一种技巧可以在不实际执行计算的情况下预测乘积的位数。位数可以通过两个被乘数加1的四舍五入(向下)和精确计算,如下所示: public static void main(String[] args) { DecimalFormat f = new DecimalFormat("#"); double num1 = 12345678901234567890d; double num2 = 31415926535

我需要找到非常大的乘法的位数(每个大约300位数)。我想知道是否有一种技巧可以在不实际执行计算的情况下预测乘积的位数。

位数可以通过两个被乘数加1的四舍五入(向下)和精确计算,如下所示:

public static void main(String[] args) {
    DecimalFormat f = new DecimalFormat("#");
    double num1 = 12345678901234567890d;
    double num2 = 314159265358979d;

    // Here's the line that does the work:
    int numberOfDigits = (int) (Math.log10(num1) + Math.log10(num2)) + 1;

    System.out.println(f.format(num1) + " * " + f.format(num2) + " = " + 
        f.format((num1 * num2)) + ", which has " + numberOfDigits + " digits");
}
输出:

12345678901234567000 * 314159265358979 = 3878509413969699000000000000000000, which has 34 digits

这将适用于任意大的数字。

克里斯托巴利托的答案几乎可以理解。让我把“关于”说得更准确一些:

假设第一个数字有n位,第二个数字有m位。最低值分别为10^(n-1)和10^(m-1)。这个乘积应该是最低的,应该是10^(m+n-2),也就是m+n-1位数

它们的最高值分别为10^n-1和10^m-1。这个乘积是最高的,是10^(n+m)-10^n-10^m+1,最多有m+n个数字

因此,如果将n位数乘以m位数,则产品将具有m+n-1或m+n位数


类似的逻辑也适用于其他基数,如基数2。

通常约为2*n,其中n是位数。您可以按如下方式绑定位数:
floor(logx)*floor(logy)@critobalito more n+m,其中n和m是每个表达式的位数。e、 g.
9*9=81
999*9=8991
@davin-数字不就是
floor(log(x)+log(y))+1
,x,y为正吗?你不需要日志,而是日志10。看我的回答这比我的回答好多了:)非常感谢大家的回答,但这一个占了上风。谢谢。当然,如果我们想要小数位数的话,只有
log10
。更一般地说,如果我们想要一个base-k位置系统中的数字,它就是log\k。但是,您可以找到以2为底的对数,然后乘以(log2)/(log10),约为0.693。只需找到二进制表示中最重要的1的位置,就可以在不使用浮点的情况下找到以2为底的对数。如果然后乘以69,整数除以100,则应在不使用整数运算的情况下找到近似数字计数。你可能永远都不应该这样做,因为这可能永远都不值得麻烦。可爱,但是,没有?为什么不在回答中添加你的评论呢?因为我认为这在实践中不太可能真正有用。我认为这个答案对于波西米亚人的回答没有意义,因为你可以精确地计算它,例如,“因此,如果您将一个n位数字乘以一个m位数字,则产品将具有m+n-1或m+n位。”这是一个松散的界限,但您可以做得更好。