Java 除以方法返回的长度-错误值

Java 除以方法返回的长度-错误值,java,overflow,primitive-types,Java,Overflow,Primitive Types,我有两种方法:幂和阶乘: public static long pow(int x, int n) { long p = x; for (int i = 1; i < n; i++) { p *= x; } return p; } public static long fact(int n) { long s = n; for (int i = 1; i < n; i++ ) { s *= i;

我有两种方法:幂和阶乘:

public static long pow(int x, int n) {
    long p = x;
    for (int i = 1; i < n; i++) {
        p *= x;
    }
    return p;
}

public static long fact(int n) {
    long s = n;
    for (int i = 1; i < n; i++ ) {
        s *= i;
    }
    return s;
}
x=10的输出为:

支票:22026.465794806718

我的姓名:21798.734894914145

x越大,“精度损失”越大(不完全是,因为你不能称之为精确…)

扭曲的是,当方法阶乘返回时,输出是正确的。谁能告诉我怎么做


方法pow和fact必须返回long,我必须在exp(大学作业)中使用它们。

long数据类型不能处理十进制精度,这就是为什么您认为long的值是错误的。为什么不让函数返回双值呢

编辑:以下是我的想法:

  public static long pow(int x, int n) 
  {
    double p = x;
    for (int i = 1; i < n; i++) {
      p *= x;
    }
    return (long)p;
  }

  public static long fact(int n) 
  {
    double s = n;
    for (int i = 1; i < n; i++ ) {
      s *= i;
    }
    return (long)s;
  }


  public static void exp(int x, double eps) 
  {
    double pow = 1.0;
    double fact = 1.0;
    double sum = 0.0;
    double temp;
    for(int ii=1; ii < 100; ii++)
    {
      pow = pow(x, ii);
      fact = fact(ii);
      temp = (double)pow/(double)fact;
      temp = temp == 1 ? 0 : temp;
      sum += temp;
    }

    System.out.println("Check: " + Math.exp(x));
    System.out.println("My: " + sum);
  }

  public static void main(final String[] args)
  {
    int x = 10;
    double eps = 0.0000000000001;

    exp(x, eps);
  }

x
通常有多大?可能是整数溢出。尝试将
pow
fact
中的所有
int
参数改为
long

如果尝试此pow方法:

public static long pow(int x, int n) {
    long p = x;
    System.out.println("Pow: "+x+","+n);
    for (int i = 1; i < n; i++) {
        p *= x;
        System.out.println(p);
    }
    return p;
}
长值溢出:
10^20
太大,无法放入长值

方法pow和fact必须长时间返回,我必须在exp(大学作业)中使用它们


那么你就没有什么办法来修复它了。如果
eps
太小,则可能引发异常

我不能,我的作业中说要用long。但是我也没能投下他们,当我试着这样做的时候:'pow=(双)幂(x,I)'和'fact=(双)事实(I)'@hodak你不能在作业中使用双倍似乎很奇怪,你确定这是正确的吗?是的,他特别声明,但他这样做可能是为了迫使我们找到答案,为什么这是不正确的。好老师,这只花了我几个小时;)x不是大的,它是从1到,比如说,20。将
int
s更改为
long
s没有帮助。哇,你说得对。在这种情况下,
long
比正常运行的
double
的范围小,这对我来说有点奇怪。。。谢谢你。@hodak-你什么意思?long的范围(~2^63)比double(~2^1023)小。这两个函数都会溢出,具体取决于参数的大小-pow()增长更快。您可以使用BigDecimal来检测情况,但很难用很长的时间来拟合结果。
Check: 22026.465794806718
My: 21946.785573087538
public static long pow(int x, int n) {
    long p = x;
    System.out.println("Pow: "+x+","+n);
    for (int i = 1; i < n; i++) {
        p *= x;
        System.out.println(p);
    }
    return p;
}
...
Pow: 10,20
100
1000
10000
...
...
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
-8446744073709551616
7766279631452241920