2013-10-14 73 views
-3

我正在做一個科學公平項目,測試五種不同的平方根算法來計算兩個平方根。 (請參閱我的問題here)。計算平方根到50個地方

我有兩個選擇。

  • 運行每個程序一段時間,然後比較最終結果與兩個平方根的接近程度。
  • 運行的每個節目,直到二的平方根是精確到50位小數,和比較使用System.nanoTime()

第二個的缺點所花費的時間是在檢查的單純進程是否真的精確到在每次迭代中五十個小數位需要一些時間,所以結果將不準確。如果還有其他方法可以做到這一點,請告知我

第一個缺點是我不知道如何在規定的時間內運行程序。

我應該採取哪一種行動?

+4

請告訴我們你的努力,直到現在 - 你試圖解決這個問題。 – Lion

+0

(側身思考)計算你的根一次,然後檢查其數字一千次。把那個時間除以1,000,你知道檢查費用多少。 (關於-h,小心緩存問題 - 你不*想要比較一個單獨運行與eachother。) – usr2564301

回答

0

我不知道如何運行一段時間的程序。

一種選擇是運行需要在線程中運行x時間的代碼。
當時間到了時終止線程,然後讓線程代碼顯示其結果。
就是這樣。

SqrtThread sqrtThread = new SqrtThread(2); //Will start automatically 
start high resolution timer 
while (time has not elapsed) { 
    sleep for very short period; 
} 
sqrtThread.interrupt(); //stop the thread. 

你實際上怎麼辦很短的睡眠是任務的一部分,所以我會離開,對於你找出:

import java.io.*; 
public class SqrtThread extends Thread{ 
    private vars..... 
    public SqrtThread (double input) { 
    super('sqrtThread'); 
    this.input = input; 
    .... 
    this.start(); 
    } 

    public void run() { 
    while !(Thread.interrupted) { 
     //Do numberChruching 
    } 
    //output result 
    }   
} 

然後你使用僞代碼一樣啓動線程。

0

測試所消耗的時間量對於每種方法都是相同的。因此,如果你對比較感興趣,這不是一個缺點。另外,我會懷疑測試所消耗的時間並不重要。

另外:無論如何你都需要這樣的測試。通常情況下,人們對給定錯誤的結果感興趣。由於所需時間取決於很多其他東西(CPU,JVM等),所以在已知時間內未獲得未知準確度。從這是對第二種方法的投票。

0

如果你設定的時間量,然後中斷的過程中,你有一個有趣的問題來回答:

  • 你收集足夠的數據來回答這個問題?

我會讓你思考這個問題,而我建議你如何打斷一個仍在計算的答案。

首先,您應該提前知道平方根的前五十位數字,因爲您需要知道答案是否正確。正確性應獨立於需要多長時間,因此也許您只需驗證一次計算,然後硬編碼正確的答案。

其次,你需要將你的平方根計算算法包裝在可以運行的東西中。我建議Java接口Runnable,強制的方法與簽名

public void run() { 
    // your code goes here 
} 

然後,你將有一些能夠與Java Thread很好融合,你可以中斷Java線程。一旦中斷了線程的結果,就不能相信線程內的任何計算(在正常情況下)。

最簡單的方法(和因爲你的項目是不是利用最新的Java技術,而是試圖反駁你的反假說)是,如果你發現了一些正在做以後類似

Thread solution1 = new Thread(new Runnable1()); 
solution1.start(); 

時間太長

Thread.sleep(10000); // sleeps the current thread 10 seconds 
solution1.interrupt(); 

請注意,這是一個非常不雅的方式來停止一個線程,你不能相信任何的Runnable1正在研究之後。

其他更復雜的技術是可用的,如:

public class Runnable1 implements Runnable { 

    private boolean running; 

    public Runnable1() { 
    running = false; 
    } 

    public void run() { 
    running = true; 
    while (running) { 
     // do one step of your computation 
    } 
    } 

    public void shutdown() { 
    running = false; 
    } 
} 

上面的例子有大量的特性它確實提高了Java代碼的質量;但是,請注意,代碼質量獨立於證明您的觀點。擦亮代碼是非常好的,忘記實際解決問題是可能的。

上面的代碼將被稱爲

Runnable1 runnable1 = new Runnable1(); 
Thread thread1 = new Thread(runnable1); 
thread1.start 

// some means of waiting 
Thread.sleep(10000); // sleeps 10 seconds 
runnable1.shutdown(); 

這種技術會關閉你的已知狀態(下一個循環迭代之前)可運行的,所以也許你可以再從技術捕獲一些中間數據,只要Runnable的其餘部分有辦法報告中間解決方案。

+0

首先,我會避免擴展'Thread'類,就像你曾經決定使用一些Java的更好的併發特性,你將不得不「無條件地」代碼。 –