none
Работа с библиотекой JavaScript. RRS feed

  • Вопрос

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

     

    private void button1_Click(object sender, EventArgs e)
      {
       double[] x = new double[6];
       double[] f = new double[6];
       double a, h, ex, xx, z, dn, nm, ff, s1, s2, s3;
       int j, k, i;
       a = Convert.ToDouble(txtBxStartValue.Text);
       h = Convert.ToDouble(txtBxStep.Text);
       ex = Convert.ToDouble(txtBxAccuracy.Text);
       x[1]=a;
       xx=x[1];
       z = FunctionCalc(xx);
       f[1]=z;
       x[2]=a+h;
       xx=x[2];
       z=2*xx*xx-Math.Exp(xx);
       f[2]=z;
       if (f[1]<f[2])
       {
        x[3]=(a-h);
        xx=x[3];
        z=2*xx*xx-Math.Exp(xx);
        MessageBox.Show(z.ToString());
        MessageBox.Show(FunctionCalc(xx).ToString());
        f[3]=z;
       }
    ....

    значение а вводится с клавиатуры как 1, h=0.5, ex=0,0005
    Сам метод:
      public double FunctionCalc(double xx)
      {
       var eng1 = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
       var result1 = Microsoft.JScript.Eval.JScriptEvaluate(
       @" var x =func("+xx.ToString()+@");
       function func(xx) 
       { 
        return 2*xx*xx-Math.exp(xx);
       }; ", eng1);
       return Convert.ToDouble(result1);
      }

    Так вот в куске кода можно увидеть, что я через MessageBox'ы так сказать сравниваю значения, подсчитанные и так и эдак. И они почему то разные! Может есть у кого то идеи?

    9 февраля 2011 г. 18:41

Ответы

  • Дело в том, что в javascript функция Math.exp принимает дробное число, разделителем которого является точка. При выполнении xx.ToString() вы получаете из дробного числа строку, но разделителем там является запятая (зависит от настроек культуры). Из-за этого Math.exp не правильно работала и результаты не сходились.

    Измените xx.ToString() на xx.ToString().Replace(",", ".")

     


    Для связи [mail]
    • Помечено в качестве ответа russia union 18 февраля 2011 г. 10:32
    10 февраля 2011 г. 6:46

Все ответы

  • up! up! Я уже теряюсь в догадках, подскажите пожалуйста
    10 февраля 2011 г. 4:24
  • Дело в том, что в javascript функция Math.exp принимает дробное число, разделителем которого является точка. При выполнении xx.ToString() вы получаете из дробного числа строку, но разделителем там является запятая (зависит от настроек культуры). Из-за этого Math.exp не правильно работала и результаты не сходились.

    Измените xx.ToString() на xx.ToString().Replace(",", ".")

     


    Для связи [mail]
    • Помечено в качестве ответа russia union 18 февраля 2011 г. 10:32
    10 февраля 2011 г. 6:46
  • Возник еще один вопрос - необходимо посчитать частную производную функции. Я это решил сделать опять же через JScript, получилась такая функция:

     

      private float FuncPrzv(int intNum, double dblValue)
      {
       var eng1 = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
       string bufStr = "var z=new Array();\n";
       for (int i = 0; i < x.Length; i++)
       {
        if (i==intNum)
         bufStr += "z[" + i.ToString() + "]=" + dblValue.ToString().Replace(',', '.') + ";\n";
        else bufStr += "z[" + i.ToString() + "]=0;\n";
       }
       string strJScrExpress = bufStr +
       @"var x =func(z);
        function func(x) 
        { 
        return " + textBoxFunction.Text + ";" +
        @"}; ";
       MessageBox.Show(strJScrExpress);
       //Оценивает и выполняет JScript код
       var result1 = Microsoft.JScript.Eval.JScriptEvaluate(strJScrExpress, eng1);
       return Convert.ToSingle(result1);
      }
    
      private void FuncCalcPrz()
      {
       double k = (FuncPrzv(0, 100.0000001) - FuncPrzv(0, 100)) / 0.0000001;
      }
    Т.е. в функцию FuncPrzv передаются номер переменной, по которой считается частная производная, и точка, в которой она считается. В самой функции составляется код для JScript, в котором все аргументы кроме нужного принимаются равными нулю (что по сути может быть любым числом). А в функции FuncCalcPrz вычисляется уже непосредственно производная. Так вот, возникла такая проблема - почему то функция при подсчете значений с приращением (100.0000001) и без приращения выдает одно и то же число. Где я ошибся? Притом что просматривая через MessageBox сам код JScript можно убедиться, что все верно. Подскажите пожалуйста.

     

    12 февраля 2011 г. 11:16
  • up up up!! хотя бы какие-нибудь версии
    12 февраля 2011 г. 20:21
  • Чему равно x и textBoxFunction.Text, этих данных не хватает для запуска вашего кода и дальнейшего поиска ошибки. И в будущем разные вопросы задавайте разными топиками. Спасибо.


    Для связи [mail]
    • Помечено в качестве ответа russia union 18 февраля 2011 г. 10:31
    • Снята пометка об ответе russia union 18 февраля 2011 г. 10:32
    13 февраля 2011 г. 22:02