crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Функция от одного аргумента возвращает разные значения ?
Введите ваше имя
Подтвердите код

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

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Белый пони Дата 5.3.2011, 14:18
  Разобрался.

Цитата(Kagami @ 5.3.2011, 12:07) *
Где в функции toFile инициализируется переменная hi? После второго вывода в cerr?

Нет. Виноват, забыл уточнить. Она инициализируется там где многоточие, причём как результат деления, т.е. дробь с большим количеством цифр после запятой, чем в "233.623" .

В итоге аргументы в двух случаях, оказались немного разные (разница в 4-м знаке).
А с учётом того, что по краям ( вблизи -1 и +1) у арккосинуса бесконечная производная, то эта четвёртая цифра дала серьёзную ошибку.


Ошибка была в том, что выражение
if( isnan(a)) a = 0;
учитывает только случай ( аргумент > +1 ). ( у значений типа 1,00000023, отрезает "хвост" - погрешнось делния double'ов) .

отдельно расписал условия для ( аргумент < -1) и (аргумент >+1) и всё заработало.

Спасибо что уделили мне время! :)
Kagami Дата 5.3.2011, 12:07
  Где в функции toFile инициализируется переменная hi? После второго вывода в cerr?
Белый пони Дата 5.3.2011, 11:07
  Здравствуйте!
Совсем не могу понять как так.

вот функция fX®:
double MainWidget::fX( double r)
{
double f = sqrt( r*r + l13*l13 - 2 * r * l13 * cos( beta23 - falpha(r)) ) - r*sqI13;
return f;
}

double MainWidget::falpha( double r)
{
double a = acos ( (r*r + l12*l12 - r*r*I1/I2) / (2 * r * l12) );
if( isnan(a)) a = 0;
return a;
}


При этом такой кусок кода:
void MainWidget::toFile()
{
double hi;
...

std::cerr << " hi = " << hi << std::endl;
std::cerr << "fX ( "<< hi << " ) = " << fX( hi ) << std::endl;
hi = 233.623;
std::cerr << "fX ( "<< hi << " ) = " << fX( hi ) << std::endl;
}


выдаёт такой результат:
hi = 233.623
fX ( 233.623 ) = 34.367
fX ( 233.623 ) = -71.3663


Как так получается Я не понимаю каких-нибудь основ С++ ?

(остальные переменные - l12, l13, beta23, I1, I2, sqI13 - члены класса MainWidget, вычисляемые один раз в конструкторе)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 17:03