Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти ошибку в расчете, Переполнение переменной или что другое? 
V
    Опции темы
sulyco
Дата 2.2.2014, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.12.2013

Репутация: нет
Всего: нет



Консольное приложение. Приведенный расчет - часть другой программы. Результирующие переменные при выполнении цикла должны стремиться к своим значениям. Одна (W2) послушно ползет к своему значению 5,82. W1 с 17-го шага отпрыгивает и далее ведет себя совершенно не понятно. Построил расчет в экселе - все сходится. Подскажите в чем проблема? ПО результатам эксела переполнения переменных быть не должно, а расчет скривился...

Код

static void Main(string[] args)
        {
            double L1 = 0.02736; // 00554250319;
            double L2 = 0.01357; // 75222627199;
            double p1;
            double p2;
            int t;

            for (t = 0; t <= 30; t++)
            {
                p1 = 1e-10;
                p2 = 1e-10;

                for (int i = 0; i <= t; i++)
                {
                    for (int j = 0; j <= t; j++)
                    {
                        if (i > j) p1 = p1 + 1 / (K(L1, i) * K(L2, j));
                        if (j > i) p2 = p2 + 1 / (K(L1, i) * K(L2, j));
                    }

                }
                double W1 = 1 / p1;
                double W2 = 1 / p2;

                Console.WriteLine("для t={2}: \t1,53:= {0}, \t5,82:= {1}", W1, W2, t);
            }
           
            

            Console.ReadLine();
        }

        public static int Fact(int n)
        {
            int i;
            int Result = 1;
            for (i = 2; i <= n; i++)
                Result = Result * i;
            return Result;
        }

        public static double K(double L, int i)
        {
            double Res = Fact(i) * Math.Exp(L * 94) / Math.Pow((L * 94), i);
            return  Res;
        }
    }


В делфи такой расчет работает, правда с типом Extended, который поддерживает диапазон от 3.37 х 10(-4932) до 1.18 x 10(4932). Поэтому подумалось о переполнении double

Это сообщение отредактировал(а) sulyco - 2.2.2014, 14:13
PM MAIL   Вверх
jonie
Дата 2.2.2014, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



и ? мы чем вам помочь должны?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
sulyco
Дата 2.2.2014, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.12.2013

Репутация: нет
Всего: нет



помощь может заключаться в объяснении разного поведения расчета для двух случаев исходных данных. Действительно ли "опрокинулась" переменная? Как ведет себя расчет на другом компе? А может это от каких-то настроек зависит?
Ну не знаю. Эксел считает, а NET -не может. Так бывает?
PM MAIL   Вверх
jonie
Дата 2.2.2014, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Так бывает, да. Особенно если перенесено неправильно.... но мы не знаем где правильно, конечно.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Экскалупатор
Дата 2.2.2014, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



MSDN Double
прочти раздел про точность и представление десятичных дробей в двоичном виде, отсюда часто возникают нестыковки. Да и хотелось бы больше информации о том что должно получаться в приведенном расчете, а не догадываться что же должно произойти, а что происходит.
PM MAIL ICQ   Вверх
sulyco
Дата 2.2.2014, 20:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.12.2013

Репутация: нет
Всего: нет



Спасибо всем за участие.
Разбирался с составляющими по отдельности. Обнаружил, что "кривит" факториал. Начиная с позиции 13!. Хотя "вместимость" int'а вроде и не превышает. Попытался "ручками" посмотреть. Начал вбивать формулу типа
int f=1*2*3*4...
До позиции *12 всё было хорошо. При простановке *13 строчка подчеркнулась красным и по наведению курсора выползло сообщение "Переполнение при выполнении операции во время компиляции в режиме с проверкой" (компилятор - студия2010)
Замена int на long результатов не дала.
Помогла замена типа факториала Fact с int на double, старт расчета факториала начал с дублёвой 0,000001, что позже компенсировал в дальнейшем расчете.

Так, что будьте бдительны при применении простейшей, казалось бы функции, факториал.
Отмечаю вопрос решенным.

PM MAIL   Вверх
Экскалупатор
Дата 2.2.2014, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



переполнение при вычислении факториала.
исправь:
Код

 public static int Fact(int n)
        {
            checked
            {
                int i;
                int Result = 1;
                for (i = 2; i <= n; i++)
                    Result = Result*i;
                return Result;
            }
        }


Добавлено через 50 секунд
чорт, пока печатал и смотрел уже появился ответ... ну главное что проблема решилась ))) удачи
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1665 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.