2013-11-02 51 views
1

我使用下面的程序來測試計算機執行牛頓迭代所需的時間,以計算兩到小數點後50位的平方根。System.nanoTime測量牛頓迭代

import java.math.BigDecimal; 
public class ScienceFair { 

public static BigDecimal NewtonMethod() 
{ 
    BigDecimal a = new BigDecimal(1); 
    BigDecimal btime = new BigDecimal(0); 
    BigDecimal etime = new BigDecimal(0); 
    BigDecimal time = new BigDecimal(0); 
    BigDecimal two = new BigDecimal(2); 
    while(a.subtract(new BigDecimal("1.41421356237309504880168872420969807856967187537694")).abs().scaleByPowerOfTen(50).doubleValue() < 1) 
    { 
    btime = BigDecimal.valueOf(System.nanoTime()*1000000000); 
    a = a.add(two.divide(a)).divide(two); 
    etime = BigDecimal.valueOf(System.nanoTime()*1000000000); 
    time = time.add(etime.subtract(btime)); 
    } 
    return time; 
} 
public static void main(String[] args) { 
    System.out.print(NewtonMethod().toString()); 
} 
} 

但是,當我運行它時,它顯示0.什麼是錯的?

回答

0

System.nanoTime()提供了的可能性的納秒分辨率,但不是保證。

此方法提供納秒的精度,但不一定 納秒級分辨率(即頻率變化值) - 沒有 保證,不同的是,這項決議是由至少不如 說的currentTimeMillis的() 。

因此,如果a = a.add(two.divide(a)).divide(two);的時間少於一毫秒(它會),測量的準確性取決於您的操作系統和JVM實現。

如果您確實使用BigDecimal(儘管您不需要),請不要在您的System.nano調用之間運行BigDecimal構造函數,除非您想將其包含在您的測量中。

編輯:我的建議是:

import java.math.BigDecimal; 
public class ScienceFair { 

    private static long NewtonMethod() { 
     BigDecimal TWO = new BigDecimal(2); 
     BigDecimal SQRT_TWO = new BigDecimal("1.41421356237309504880168872420969807856967187537694"); 
     BigDecimal TOLERANCE = BigDecimal.ONE.scaleByPowerOfTen(-50); 

     long start = System.nanoTime(); 

     BigDecimal a = new BigDecimal(1); 
     BigDecimal two = new BigDecimal(2); 
     while(a.subtract(SQRT_TWO).abs().compareTo(TOLERANCE) >= 0) { 
      a = a.add(TWO.divide(a)).divide(TWO); 
     } 

     return System.nanoTime() - start; 
    } 

    public static void main(String[] args) { 
     System.out.println(NewtonMethod()/10e6); //# of milliseconds 
    } 
} 
+0

對我怎麼可能使這項工作任何想法? –

+0

@AkshajKadaveru,看到我更新的答案。 –

+0

我知道這個衡量操作你以前沒有測量過。但是,你不應該衡量這些嗎? –