2013-10-14 7 views
-3

Я делаю проект научной ярмарки, который проверяет пять различных алгоритмов квадратного корня для вычисления квадратного корня из двух. (см. мой вопрос here).Расчет квадратного корня до 50 мест

У меня есть два варианта.

  • Запустите каждую программу за определенное количество времени и сравните, насколько близок конечный результат с квадратным корнем из двух.
  • Выполнить каждую программу до тех пор, квадратный корень из двух не является точным до пятидесяти знаков после запятой, и сравнить время, потраченное с использованием System.nanoTime()

Минусом второй в том, что сам процесс проверки, является ли он с точностью до Пятьдесят десятичных знаков на каждой итерации занимают некоторое время, поэтому результаты не будут точными. Если есть какой-то другой способ сделать это, сообщите мне

Недостатком первого является то, что я не знаю, как запустить программу на определенное количество времени.

Какое направление действий следует принять?

+4

Пожалуйста, покажите нам свои усилия до сих пор - что вы пытались решить проблему. – Lion

+0

(Боком мысли) Рассчитайте свой корень один раз, а затем проверьте его цифры тысячу раз. Разделите это время на 1000, и вы знаете, сколько стоит проверка. (About-ish. Остерегайтесь проблем с кешированием - вы делаете * не * хотите сравнить один запуск либо с eachother.) – usr2564301

ответ

0

Я не знаю, как запустить программу на определенное количество времени.

Один из вариантов - запустить код, который должен выполняться в течение x времени в потоке.
Завершите поток, когда время закончится, а затем введите код потока, чтобы представить его результат.
Что-то вроде этого.

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 
    }   
} 

Затем вы начинаете тему с помощью псевдокода, как:

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. 

Как вы на самом деле очень короткий сон является частью задания, так что я оставлю это для вас, чтобы узнать.

0

Время, затраченное на испытание, будет одинаковым для каждого метода. Следовательно, если вы заинтересованы в сравнении, это не является недостатком. Кроме того, я подозреваю, что время, затрачиваемое на тест, не является значительным.

Кроме того, вам нужен такой тест в любом случае. Обычно каждый интересуется результатом до определенной ошибки. Не в неизвестной точности, полученной в известное время, так как необходимое время зависит от многих других вещей (CPU, JVM и т. Д.). Из этого следует голосовать за второй подход.

0

Если вы делаете определенное количество времени, а затем прервать процесс, у вас есть интересный вопрос, чтобы ответить:

  • ли вы собрать достаточно данных, чтобы ответить на этот вопрос?

Я позволю вам задуматься над этим вопросом, в то время как я предлагаю, как вы могли бы прервать все еще расчетный ответ.

Прежде всего, вы должны заранее знать первые пятьдесят цифр вашего квадратного корня, так как вам понадобится «знать», если ответ правильный. Правильность должна быть независимой от того, сколько времени потребуется, поэтому, возможно, вы просто проверите расчет один раз, а затем скорректируйте правильный ответ.

Во-вторых, вам нужно упаковать ваши алгоритмы расчета квадратного корня в то, что можно запустить. Я хотел бы предложить, что интерфейс Java Runnable, который заставляет метод с подписью

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

Тогда вы будете иметь то, что будет хорошо гармонировать с Java Thread и вы можете прервать Java потоки. После прерывания результатов Thread, вы не можете доверять никаким вычислениям из потока (при нормальных обстоятельствах).

Самый простой способ (и так как ваш проект не об усилении новейших 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, вам все равно придется «не писать» этот код. –