2016-05-12 3 views
-6

Я хочу использовать в качестве цикла как: Пример Я поместил в текстовое поле 123 и 300 в формулу.C# логика (требуется решение для кодирования)

1/2 * (300 + 123/300) = 150,205 >> Ответ

я хочу цикла этот пример я получил ответ 150,205 следующая формула должна выглядеть следующим образом

1/2 * (150.205 + 123/150.205) = 75.512

Ответ этого уравнения Я хочу добавить следующую формулу по петле.

я написал код, но я не знаю, как использовать его с помощью петли

Моего кода.

double value = (0.5 * (300 + 123/300)); 

=======================================

для конца цикла

При выполнении условия матча, как этот 1/2 * (11,091 + 123/11,091) = 11,091 Значение Ответ и вход, где им ввод 300 будет же я хочу, чтобы разорвать петлю

**Example** I want to do this without using square root function in c# 
    like simple if i want a root of 9 it will be 3 so it will be like this . 
    i choosen 1 Because 9 is one value so i choosen 1 
    1/2*(1+9/1) = 5.000 
    1/2*(5+9/5) = 3.400 
    1/2*(3.4+9/3.4) = 3.024 
    1/2*(3.024+9/3.024) = 3.000 
    1/2*(3+9/3) = 3.000 
    see you will get same value in one point always 
+0

когда вы хотите прекратить цикл? – PaulF

+2

C'mon Jonny, вы можете попробовать больше, чем просить совета. –

+0

Когда условие соответствует этому = 1/2 * (11.091 + 123/11.091) Значение Ответ и ввод, где i m put 300 будет таким же, как я хочу, чтобы разбить цикл – Jonny

ответ

1

Единственное хитрое дело вот сравнение с толерантности, так как из-за округлить ошибки вы можете хорошо никогда встречаются

answer == value 

состояние. Реализация может быть

double answer = 300.0; 
    double tolerance = 1e-10; 

    while (true) { 
    // based on previous answer we compute next one 
    double value = 0.5 * (answer + 123.0/answer); 

    //TODO: you can print out steps here, if you want something like this 
    //Console.WriteLine(value); 

    // check convergence with tolerance 
    if (Math.Abs(answer - value) <= tolerance) { 
     answer = value; 

     break; 
    } 

    // next answer (value) becomes the previous one (answer) 
    answer = value; 
    } 

    // 11.0905365064094 
    Console.Write(answer); 

фактический ответ (это доказать) просто квадратный корень:

// 11.09053650640941716205160010261... 
    Console.Write(Math.Sqrt(123)); 

реализация Реальная жизнь (если мой босс хочет, чтобы я его реализации):

public static double NewtonEstimation(Func<double, double> function, 
             double tolerance = 1e-10, 
             double guess = 1.0) { 
    if (null == function) 
    throw new ArgumentNullException("function"); 
    else if (tolerance < 0) 
    throw new ArgumentOutOfRangeException("tolerance", "tolerance must not be negative"); 

    while (true) { 
    double value = function(guess); 

    if (Math.Abs(value - guess) <= tolerance) 
     return value; 

    guess = value; 
    } 
} 

... 
// 11.0905365064094 
Console.Write(NewtonEstimation(x => 0.5 * (x + 123/x))); 
+0

@ Jonny: Я вижу, квадратный корень, * метод Ньютона *; https://en.wikipedia.org/wiki/Newton%27s_method –

+0

Мой вопрос также называется грубым методом оценки, который я задаю :) Но если вам нравится вы можете решить в программировании метода C# newton, я буду признателен, если вы может решить его – Jonny

+0

Великий сэр Дмитрий Быченко его рабочий – Jonny

Смежные вопросы