![]() |
|
![]() ![]() ![]() |
|
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ребят! Есть программа:
Не могу вывести рез-т на экран... пробовал добавить в код: Form1->Edit1->Text=k; но он ее не распознает k! А если сделать K глобальной переменной, то выводит 1... как быть? |
|||
|
||||
nworm |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 502 Регистрация: 22.10.2005 Репутация: 1 Всего: 8 |
Если это под консоль планируется, то надо в начало добавлять
А если, формочки, то вместо main будет Button1Click... |
||||
|
|||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Код исправил:
Только теперь возьникает ошибка: invalid floating point operation. По инету вроде полазил, однако не получается исправить! Help! |
|||
|
||||
Michrutka |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
а в какой строчке возникает ошибка?
к слову
функция abs возвращает целое число по скольку что left, что right у тебя double нужно испоьзовать функцию fabs()
|
||||
|
|||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ошибка в этой строчке:
while (abs(right - left) >= pow(static_cast<double>(10), -15)); Спасибо за fabs!) |
|||
|
||||
Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Вовсе нет. У меня ошибка в этой строчке:
right получает значение +INF. Не вдаваясь в преобразования констант (вполне достаточно десятичной точки), я не лезу в математику - в виду того, что уже давно все забыл напрочь и я не помню что там с отрицательными дробными степенями. Просто констатитурю: ошибка тута. |
||||
|
|||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Вроде исправил эту строчку:
Тока за ошибкой следует ошибка... теперь: floating point division by zero. Видимо, это из-за слишком больших чисел... тока во что с ними делать? |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Вот сама задача:
k изменяется от 0 до бесконечности ((4k+1)! / [(2k)!]^2) * x^2k = =1/2*[(1-4x)^(-3/2) + (1+4x)^(-3/2)] X принадлежит интервалу [-1/4 ; 1/4) Найти мин. k, которое будет удовлетворять условию: abs(правая часть - левая часть) < 10^(-15) |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
интересное исполнение факториала + к этому почему тип double у функции факториала??? а почему передается дробное? факториал у дробного числа? Надо бы саму логику и математику продумать, а потом писать... -------------------- |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Мне кажется, что методом перебора такие задачи вообще не решаются В программе перебирается х, а в задаче сказано
Тогда, получается, что надо перебирать k? До бесконечности? Задача решается другим методом, не перебором. |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
В задаче вроде перебирается и x (в заданном интервале) и k (до завершения условия)! А как по-другому можно сделать?
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Т.к. надо сравнивать с 10^(-15), то и к X я прибавляю 10^(-15)...
Это сообщение отредактировал(а) molodzo - 9.3.2009, 22:52 |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ничего. Это все условие... Но так наш препод пишет по памяти число "П" с огромным количеством знаков! А также говорит о погрешностях, возникающих из-за этих длинных чисел, то я думаю это логично...
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Хорошо, я рад за препода и изменю свой вопрос: В каком виде должен быть ответ? При к таком-то и х- таком-то? либо в виде таблицы? Если последнее то ответ может превратиться в книжку. |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
При k таком-то, x - таком-то. Ну и еще right и left.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
А это зачем? Для контроля? Что х задан правильно? Не в даваясь в математику - можно и перебором сделать - раз х задан, перебираем тоько к, думаю там не особо много будет. А у вас в программе перебирается х. Зачем его перебирать, если он задан фиксировано? Надо перебирать к. Надеюсь, что до бесконечности дело не дойдет Добавлено через 57 секунд Минутку, если и к задан, то что искать-то? Или я туплю? |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Как это k задан???
![]() А может задача уже решена ![]() ![]() Это сообщение отредактировал(а) molodzo - 9.3.2009, 23:37 |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Опять вернулись к интервалу. Если ответ выдавать для х от [-0.25 до 0.25) с шагом 10^(-15) то получится таблица с триллионами значений. Вот я и интересуюсь, может все-таки у х шаг какой-то более адекватный должен быть? ![]() |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ну хорошо... я завтра постараюсь уточнить!
![]() Даже если брать с другим шагом, то как исправить ошибки? |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
http://www.wikiznanie.ru/ru-wz/index.php/%...%81%D0%BB%D0%B0
вот факториал дробного числа... может у Вас в задаче к - целое? -------------------- |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Да... я это упустил! K, видимо, целое. Ну даже не в этом сейчас суть... Пусть пока K- целое, x- изменяется с любым шагом... даже при таких условиях появляются ошибки...
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Берем начальный х: -1/4 Берем указанную формулу (вернее часть) (1+4x)^(-3/2) 1+4*(-1/4) = 0 0 в отрицательной степени вообще существует? |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
будет давать бесконечность... -------------------- |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ну вы меня окончательно запутали!
![]() Все... завтра попробую уточнить! Спасибо. Это сообщение отредактировал(а) molodzo - 10.3.2009, 00:29 |
|||
|
||||
Dmi3ev |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
совет, у тебя много расчетов, поэтому постарайся помочь себе 1) вот твое выражение ((4k+1)! / [(2k)!]^2) * x^2k х постоянно меняется с шагом 10^(-15) поэтому выражение x^2k считать надо каждый раз, а вот выражение (4k+1)! / [(2k)!]^2) относительно постоянное, те на его изменение влияет к, а к меняется только когда х пройдет от -0.25 до 0.25 с шагом 10^(-15), представь насколько будет быстрее твоя программа, если вот этот расчет (4k+1)! / [(2k)!]^2) ты будешь делать не каждый раз... а один раз для к=1, потом будешь пересчитывать только когда к будет 2... гораздо рациональнее просто ты порядка 2*10^15 раз лишних вот это выражение, а это немало... Добавлено через 4 минуты и 50 секунд
а вот тут зачем считать каждый раз, если это значение переменной step, которую ты уже посчитал... Добавлено через 8 минут и 32 секунды
шаг поменьше взял, вроде работает... при этом еще учти то что говорит Anikmar про нули в отрицательной степени и посмотри, когда такое может получиться... -------------------- |
||||||
|
|||||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Уточнил:
1) препод изменил условия: x изменяется от (-1/4; 1/4). Следует 0 в знаменателе не будет! 2) x можно ввести самому в пределах интервала Dmi3ev, а чем ты компилируешь, а то у меня возникает ошибка(в C++ Builder 2007): Floating point overflow... Это сообщение отредактировал(а) molodzo - 10.3.2009, 18:08 |
|||
|
||||
Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
ms vs 2008 в какой строке ошибка?
сделай так, чтобы нули не получались и все будет ок... скорее всего поэтому ошибка... Это сообщение отредактировал(а) Dmi3ev - 10.3.2009, 18:40 -------------------- |
||||
|
|||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Пробую откомпилировать в Visual Studio 2005. Создал progect(по умолчанию), код вставил в name.h... А вот что нужно выбрать при: executable for debug session?
|
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ура! Удалось запустить! Только вот странность: при любом значении step, программа выдает одно и тоже значение (k = 17)... Кто-нибудь знает в чем ошибка?
|
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Исправил все значения на double... прога стала выдавать значения k = 43 при любом x!
Если вместо float поставить long double, то k уже будет равняться 50! Также не получается нормально вывести left(пишет left = 1.#IND), а вот у right нормальное число! Кто-нибудь знает почему такое происходит и как это исправить?
|
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
короче, molodzo, программа у тебя правильно работает, осталось только предусмотреть те случае, когда могут быть 0 (в отрицалтельной степени) и еще немного въехать в то, что компьютер некоторые числа воспринимает одинаково, хотя они не равны... Добавлено через 12 минут и 23 секунды molodzo, я понял, где косяк, завтра выложу полное решение... -------------------- |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
molodzo, А вы уверены, что уравнение сходится при любом х?
Мне лень было кодить и я загнал вашу формулу банально в excel, и напоролся на х (простите, не помню какой), который в принципе не сходился. Может быть добавить проверку, что при таком-то х, к просто не существует? |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
Проблема в том, что мы считаем (ты говоришь, что к-бывает 43):
((2*43)!)^2=(86!)^2=(1*2*3*...*86)*(1*2*3*...*86) (4*43+1)!=173! - это число точно не почитает, отсюда и ошибки... нужно пользоваться чем-то другим для хранения таких больших чисел... попробуй просто написать прогу:
не пробовал! но на вскидку, дальше 100 точно не должен уйти... -------------------- |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Выражение надо упростить и обойтись без факториала. Использовать несколько другой метод.
Посмотрим на формулу повнимательнее и раскроем ее При к=1 Дробь получится 5!/(2!*2!) В развернутом виде (1*2*3*4*5)/(1*2*1*2) При к=2 9!/(4!*4!) В развернутом виде (1*2*3*4*5*6*7*8*9)/(1*2*3*4*1*2*3*4) При к=3 13!/(6!*6!) В развернутом виде (1*2*3*4*5*6*7*8*9*10*11*12*13)/(1*2*3*4*5*6*1*2*3*4*5*6) Т.е. сразу видно какую часть можно сократить, а подсчет уже производить не втупую вычислением числителя и знаменателя, а последовательным умножением 7 * 8/2 * 9/3 * 10/4 * 11/5 * 12/6 * 13 Никакого переполнения у нас не будет. И т.д. для любого к |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
Anikmar, сильно не вдумывался, но тут, конечно, надо что-то преобразовывать и считать не в лоб, потому как в лоб не выходит стандартными средствами... или нужно уже брать длинные числа и шпарить...
-------------------- |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
что вроде...
только я брал порядок 10^(-5), думаю, ты легко это поправишь...
Это сообщение отредактировал(а) Dmi3ev - 14.3.2009, 12:03 -------------------- |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Хм... странная программа... А она у тебя работает? Какие числа выдает?
У меня она считает как будто до бесконечности! А если вручную ввести i, то тоже непонятно когда остановится... Я поставил if k >1500 break; и прога у меня посчитала до этого значения за 3 сек!!! странно... P.S. Спасибо за участие! |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
у меня она выдает последние такие:
Добавлено через 11 секунд ща досчитает... ![]() Добавлено через 3 минуты и 46 секунд x=-0.21262 left=1.28753 right=1.28753 res=4.8107e-006 min=4.8107e-006 2 собственно 2 и есть ответ... Добавлено через 9 минут и 50 секунд а ты паузу сделай и посмотри min уменьшается? в смысле в консоли (я нажимаю правую кнопу мыши или pause и смотрю) -------------------- |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Да! У меня тоже наконец посчитала
![]() А вот почему, если я ввожу x сам(допустим x = 0.21), у меня прога выдает другие значения! И left при этом равняется 1.#IND ? |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
как ты ввод организуешь? я же не вижу, что ты там творишь? -------------------- |
|||
|
||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Вот так:
|
|||
|
||||
Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
представь себе, что при х=0,21 если и есть решение (а его нет), то оно очень далеко, в смысле при большом К.... так вот, поэтому К просто тупо увеличивается и достигает такого значения, что myleft=1.#IND... чтобы что-ваще видеть, надо так хотя бы писать...
при этом коде К достигается 238 при этом myleft=2.31692e-35, после чего myleft сначала равно 0 некоторое время, а потом уходит в - бесконечность... что логично... пора переставать задавать глупые вопросы и включать... -------------------- |
||||
|
|||||
molodzo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.11.2007 Репутация: нет Всего: нет |
Ладно, не буду больше приставать)
![]() Всем спасибо! Особенно, Anikmar и Dmi3ev! Удачи! Это сообщение отредактировал(а) molodzo - 16.3.2009, 15:33 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |