crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 6:16