Функция часов возвращает нулевую разницу во времени - PullRequest
0 голосов
/ 31 октября 2019

По какой-то причине следующая программа печатает длительность = 0.000000000000000000. Я прочитал очень похожий вопрос Функция C `clock ()` просто возвращает ноль , но предложения там не помогли. Цикл, между которым я беру выборки по времени, состоит из 100 итераций, и для каждой из них существует метод поиска корня Ньютона с точностью до 0,00000001, конечно же, вычисление не может занять 0 секунд ^ -20? Извините, если эти вопросы выглядят по-настоящему домашними заданиями, я действительно нуб, когда дело касается кодирования. Кто-нибудь видит, что здесь может быть не так? Спасибо!

double f(...){...}
double h;
double newton (double prev_step_solution, double x)
{
  double root=prev_step_solution;
  while (((prev_step_solution+h*f(root,x)-root)>0.00000001)
    ||((prev_step_solution+h*f(root,x)-root)<-0.00000001))
  {
    root = root-(h*f(root,x)+prev_step_solution-root)/(h*fder(root,x)-1);
  }
  return root;
}             

int main()
{
  int i;
  double euler [2][101];
  h=1/100;
  std::clock_t start;   
  double duration;

  start = std::clock();
  for (i=1; i<=200; i++)
  {
    euler [0][i] = h*i;
    euler [1][i] = newton(euler[1][i-1],h*(i-1));
  }
  duration = ((double)( std::clock()-start  ))/((double) CLOCKS_PER_SEC);

  printf(" euler %.20f \n",(double)duration);
  return 0;
}

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Работает просто отлично для меня. В вашей программе есть ошибки:

for (i=1;i<=200;i++)
{
    euler[0][i]=h*i;
    euler[1][i]=newton(euler[1][i-1],h*(i-1));
}

Размер массива Эйлера равен euler[2][101] (101), но вы повторяете его 200 раз.

Измените цикл на for (i=1;i<=100;i++)

Кроме того, инициализируйте запуск -> std::clock_t start = std::clock();

0 голосов
/ 31 октября 2019

Другой подход к синхронизации - использовать библиотеку std::chrono.

#include <chrono>
#include <iostream>

int main()
{
  auto start = std::chrono::steady_clock::now();

  // do work

  auto end = std::chrono::steady_clock::now();

  auto result = std::chrono::duration<double, std::milli>(end - start).count();

  std::cout << result << " milliseconds\n";

}
0 голосов
/ 31 октября 2019

Вы печатаете результат в секундах. Вы уверены, что эта функция работает более 1 секунды?

Вы можете попытаться напечатать время начала и окончания, чтобы проверить, верны ли их значения.

Вы также можете изменить /((double) CLOCKS_PER_SEC" на /(((double) CLOCKS_PER_SEC/1000)", чтобы получить результат n мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...