2015-03-24 32 views
0

我正在做一个关于密码学院的问题。我的程序的一部分是,我想获得这样的力量(2744^x)%24852977 = 8414508。我有一个循环使0.001增加了一倍。我的问题是这样的:而不是我的循环每次增加0.001,它显示一个数字更长的小数位。这是否与长MIN/MAX值有关,如果是的话,我将如何解决这个问题,或者任何人都可以解释我是否会出错?这是我的增量样本。如何获得4位小数点的截止点。我的循环增量似乎是错误的

10.276999999989387 10.277099999989387 10.277199999989387 10.277299999989387 10.277399999989386 10.277499999989386 10.277599999989386 10.277699999989386 10.277799999989385

import java.lang.*; 
    public class crypt { 
    public static void main(String args[]) 
    { 
     long p =24852977;//variables 
     long g = 2744; 
     long sum = 8414508; 
     long c1 = 15268076; 
     long c2 = 743675; 

     for(double i=0; i<=p; i=i+0.0001)//loop for increasing the power in next part of the program 
     { 
      long num=(long)(Math.pow((long)g, i));//number = g to the power of i 
      System.out.println(i);// just to check 
      if(num % p == sum)//my equation 
      { 
       System.out.println(i);//print the power that satisfy's this 
      } 
     } 
    } 
} 
+0

现代PC型计算机使用的浮点类型不能表示所有可能的实际值,所以会出现舍入误差。 – 2015-03-24 23:39:23

+0

如果您试图获得一个可以提高2744的数字,结果是模数24852977中的结果是8414508,那么这完全是错误的。你的答案应该是一个整数,而不是浮点数。权力不会等于8414508;它将是8414508加上24852977的倍数。你已经完全计算出了错误的数量。 – 2015-03-25 00:33:07

+0

提高措辞 – 2015-03-25 01:10:31

回答

0

记住数字的内部表示是二进制的。因此,每个十进制数字不一定有精确的二进制表示。也就是说,您的0.0001增量没有确切的表示,并且预计会有舍入误差。

+0

是的,谢谢我明白你的意思了。 1/2,1/4,1/8。谢谢 – 2015-03-24 23:42:12

+0

很酷。请将答案标记为已接受。最好的祝愿! – amahfouz 2015-03-24 23:42:50