Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取双数模_Java_Algorithm_Module_Double_Precision - Fatal编程技术网

Java 取双数模

Java 取双数模,java,algorithm,module,double,precision,Java,Algorithm,Module,Double,Precision,我已经给出了两个数字a和b。我必须计算(a^b)%100000007。如何计算浮点数。例如: a= 7.654 and b=10000 这是我的代码将%工作: public static double super_pow(double A , long B){ double o=1; while(B>0){ if((B&1)!=0) o*=A; A*=A;

我已经给出了两个数字
a
b
。我必须计算
(a^b)%100000007
。如何计算浮点数。例如:

a= 7.654 and b=10000
这是我的代码将%工作:

 public static double super_pow(double A , long B){

          double o=1;

          while(B>0){

              if((B&1)!=0) o*=A;

              A*=A;
              B/=2;
              o%=mod;
              A%=mod;
          }

          return (o)%mod;
    }

%
模吗?

这取决于你使用的语言。但一般来说,浮点值不知道模运算。你可以自己计算。假设正浮点数
a=7.654
b=10000.0
so

d = a/b = 0.0007654                               // division
r = d-floor(d) = (0.0007654-0.0) = 0.0007654      // remainder
r = r*b = (0.0007654*10000.0) = 7.654             // rescale back
  • 楼层(x)
    向下舍入到最接近的小于或等于
    x的数字
  • d
    保存浮点除法结果
  • r
    保存余数(模)
另一个例子是
a=123.456
b=65

d = a/b = 1.8993230769230769230769230769231
r = (d-floor(d))*b = 58.456
这可用于
a、b的整数值和十进制数值,但要注意,浮点单元执行舍入操作,可能会在数位数后失去精度。。。如果我没记错的话,64位
double
变量通常最多可使用
18位


[Edit1]嗯,你把问题重新编辑成了完全不同的问题

因此,您正在搜索
modpow
。您可以在google上搜索
modpow
的java实现。举个例子

在32位整数运算中,可以找到C++的GUI实现,但具有特定属性的静态模素数。如果你改变了所有的

if (DWORD(d)>=DWORD(p)) d-=p;

d=d%p它适用于任何模。您需要
modpow、modmul、modadd、modsub

是的,在Java中,您可以对浮点类型使用%运算符

但是,指数会有问题:不能使用
%
来减少中间结果,因为模不分布在浮点乘法上:
(a*b)%c
不是
(a%c)*(b%c)
。如果你试图直接计算7.654^10000,你会得到无穷大;它超过了
double
的最大值。即使没有,您也不能信任结果的最低数字,因为它们是由舍入和表示错误产生的纯噪声

您可以使用一个实现精确算法的库,例如java.math.BigDecimal,但这将在执行时间和内存方面花费很多。如果你认为你需要做这个计算作为一个更大问题的一部分,也许你应该后退一步,找到另一种方法

编辑:以下是使用
BigDecimal
的结果:

BigDecimal[] divmod = new BigDecimal("7.654").pow(10000)
                             .divideAndRemainder(new BigDecimal("1000000007"))

return divmod[1].doubleValue() // I get 9.01287592373194E8

在java中,可以对浮点/双精度()

如果必须计算(a^b)%1000000007,您可以使用
double
计算
a
b
(),这使得求幂更容易,请使用
pow()
方法()

或者,您可以将^b的结果键入到
long
,然后使用

double pow = Math.pow(A,B);
long mod = (long) pow%1000000007L; // the 'L' is important see https://stackoverflow.com/questions/5737616/what-is-the-modulo-operator-for-longs-in-java
return mod; //return a long not double in function

如果该语言缺少浮点模运算符,则其标准库可能有一个函数,如中的
fmod
C@Joni是的,但这是一个很好的知道它做什么,如何无论如何,以及什么是要知道的。。。我回答的时候没有语言标签,所以我做了计算,而不是建议libhmm你把问题重新编辑成完全不同的问题。。。见我的回答[edit1]
double pow = Math.pow(A,B);
long mod = (long) pow%1000000007L; // the 'L' is important see https://stackoverflow.com/questions/5737616/what-is-the-modulo-operator-for-longs-in-java
return mod; //return a long not double in function