LINUX.ORG.RU
ФорумTalks

[чудеса?][C++]Интерполяция Лагранжа

 


0

1

В универе сдавали лабу на плюсах по интерполяции Лагранжа, так вот, при попытке ввести значение х вне диапазона, борландси вылетел с кучей ошибок. Скомпилировала тот же код дома в g++ - всё работает. Как так?


> g++ - всё работает. Как так?

очевидно же - g++ сначала сматерился, а потом молча исправил все ошибки

aho
()

дык глюкландси уже сто лет в обед...

drBatty ★★
()

у тебя данные не вводятся во время выполнения программы? Только статически?

luke ★★★★★
()
Ответ на: комментарий от AiFiLTr0
#include <iostream>

using namespace::std;



  double x[6]={0.02,0.08,0.12,0.17,0.23,0.30};

  double y[6]={1.02316,1.09590,1.14725,1.21483,1.30120,1.40976};



  /* double x[6]={0.115,0.120,0.125,0.130,0.135,0.140};

  double y[6]={8.65729,8.29329,7.95829,7.64893,7.36235,7.09613}; */





  double l(double xx, int n, int i)

  {

    double P1=1,P2=1;

    int j;

     for (j=0; j<n; j++)



      {

	if ( j == i ) continue;

	 P1 *= xx - x[j];

      }



     for(j=0; j<n; j++)

     {

      if (x[i] == x[j]) continue;

       P2 *= x[i] - x[j];

     }



   return P1/P2;

  }



  int main ()

{

  

  int n = sizeof(x)/sizeof(double);

  double xx=0.6;

  float L=0;



  for(int i=0;i<n;i++)

   {

     L+=y[i]*l(xx,n,i);

   }

   cout<<L<<" "<<endl;

 return 0;



}
by_zero
() автор топика
Ответ на: комментарий от by_zero

Нет, мог попасть в неочевидный просак, порожденный быдлокодом. И покажи его для начала, а то получается необоснованная клевета на компилятор.

Solace ★★
()

Откройте уже для себя Numerical Recipes.

libfun
()

Кстати, вы там случайно в универе не запускаете Borland C++ на DOSBox,который работает из-под FreeBSD?

libfun
()
Ответ на: комментарий от by_zero

А какими ошибками борлондовский компилятор сыпал? Слепая проверка вида

g++ -ansi -Wall

говорит, что код нормальный

kim-roader ★★
()
Ответ на: комментарий от by_zero

я вспомнил - надо как-то математику включить. в настройках borland-c вроде-бы... Она по дефолту вырублена, и он даже умножать не умеет.

drBatty ★★
()
Ответ на: комментарий от Lorchanko

Там же из-за деления потом проблем с преобразованиями типов не огребешь. Да и тип массива оказывается захардкоден.

Прозреваю у ТСши красную точку на лбу.

mclaudt
()

борландси - глючное поделие, я в нем лично 2 бага нашел

Harald ★★★★★
()
Ответ на: комментарий от vasily_pupkin

[берёт чипсы с пивом и устраивается поудобнее] Продолжайте, господа!

hdfan2
()
Ответ на: комментарий от luke

>ну у меня на TurboC v2.0 по дефолту была включена

ну я не помню. но есть там такой прикол. в стародавние времена не было сопроцессора, он появился только в i80486, и некоторые справедливо считали, что ненужно в любой код пихать эмуляцию. Начиная с i80486 эмуляция не нужна, и теперь умножение в C++ работает и так.

drBatty ★★
()
Ответ на: комментарий от mclaudt

>Там же из-за деления потом проблем с преобразованиями типов не огребешь. Да и тип массива оказывается захардкоден.

где там преобразование? size_t / size_t

оно по определению size_t.

drBatty ★★
()
Ответ на: комментарий от drBatty

>это дополнительная микросхема i80286

s/286/287/ же...

drBatty ★★
()
Ответ на: комментарий от drBatty

>>оно по определению size_t.

Ага, а как они делятся, да еще для разных архитектур - это нужно контролировать по мануалам.

Объясни, зачем такую очевидно самостоятельную сущность, как количество элементов массива, нужно привязывать к типу элемента массива? Неужели нет готовых низкоуровневых функций для этого?

mclaudt
()
Ответ на: комментарий от mclaudt

>Ага, а как они делятся, да еще для разных архитектур - это нужно контролировать по мануалам.

size_t - это макрос, определенный в stddef.h, как правило, unsigned long. Какие могут быть проблемы с делением?

Lorchanko
()
Ответ на: комментарий от Lorchanko

>>Какие могут быть проблемы с делением?

Пара вспомогательных байтов на массив для хранения какой-нибудь контрольной суммы?

Главная проблема в том, что это лишнее связывание заведомо независимых сущностей.

mclaudt
()
Ответ на: комментарий от mclaudt

>Пара вспомогательных байтов на массив для хранения какой-нибудь контрольной суммы?

Что это?

При создании сишного массива компилятор умножает размер типа на количество элементов и тупо выделяет нужный кусок памяти. Количество элементов нигде не хранится, хочешь отдельную сущность - STL тебе в руки...

Lorchanko
()
Ответ на: комментарий от Lorchanko

>>компилятор умножает размер типа на количество элементов и тупо выделяет нужный кусок памяти.

Это всего лишь временно сложившаяся практика, здесь и сейчас. Зачем к ней намертво привязывать логику кода, связывая сущности?

mclaudt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.