На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Ошибка: floating point overflow , кто то сталкивался с алгоритмом ALGLIB???
    Ошибку выдает

    procedure APVAdd(
    VDst: PDouble; I11, I12: AlglibInteger;
    VSrc: PDouble; I21, I22: AlglibInteger;
    S: extended);overload;
    var
    I, C: LongInt;
    begin
    Assert(I12-I11=I22-I21, 'APVAdd: arrays of different size!');
    Inc(VDst, I11);
    Inc(VSrc, I21);

    //
    // Generic pascal code
    //
    C:=I12-I11;
    for I:=0 to C do
    begin
    VDst^:=VDst^+S*VSrc^;
    Inc(VDst);
    Inc(VSrc);
    end;
    end;


    В чем может быть ошибка???
    Сообщение отредактировано: ermik_8810 -
      При вычмслении получается слишком большое по модулю число, которое не может быть представлено данным форматом.

      Добавлено
      А VDst уже заполнен чем-нибудь?
        Да заполнено. Ошибку выдает когда по второму разу код проходит. Сначала выполняется
        while I<=M2 do
        begin
        T := V[I+1-M1];
        APVAdd(@WORK[0], N1, N2, @C[I][0], N1, N2, T);
        Inc(I);
        end;

        вот когда i=2 тогда выдает ошибку в функции APVAdd. Как можно исправить ошибку??? Код писала не я. Это алгоритм ALGLIB, оттуда взяла SVD(Сингулярного разложения матрицы).

        Добавлено
        в первый раз S=1.
        второй раз S=-2.3645621257e+4596.
        Можетпроблема в S???
        C указателями често говоря раньше не очень то и работала, поэтому сама не могу разобраться в ошибке.

        Добавлено
        перед циклом специально обнулила VDst но все равно при втором проходе выдает ошибку.
          Можно попробовать Extended вместо Double, если проблема действительно в разрядности.

          Добавлено
          Цитата ermik_8810 @
          второй раз S=-2.3645621257e+4596.
          Можетпроблема в S???

          Это уже почти предел возможности Extended! Самое главное чему будет равен результат умножения и сложения!!!
            поменяла Double на Extended.
            Теперь на четвертом проходе выдает "Invalid floating point operator" и опять на этой строчке.
              Видать при таких данных задача не имеет решения.
                и нечего нельзя поделать???

                Добавлено
                в книжке откуда беру матрицу есть решение, но алгоритм почему то не работает :(
                  О данном алгоритме я ничего не знаю. Жди специалистов.
                  Пока перепроверь правильность значений в массиве V[]- а то в нем какие-то большие значения.
                  Попробуй проверить алгоритм на других значениях.
                    попробовала взять другой массив, теперь в другом месте и другую ошибку выдает. Видимо проблема в алгоритме(
                      Цитата ermik_8810 @
                      второй раз S=-2.3645621257e+4596.
                      Можетпроблема в S???

                      Конечно.
                      И вполне возможно что это просто неинициализированное "мусорное" значение в результате элементарного выхода за диапазон индексов в
                      Цитата ermik_8810 @
                      while I<=M2 do
                      begin
                      T := V[I+1-M1];
                        проблема наверное в моем коде. так как алгоритм должен работать. может я что то не так сделала. я взяла из ALGLIB модули связанные c SVD и перенесла в папку своей проги, дальше в коде их добавила и вызвала функцию из файла SVD, но почему то при разных матрицах разные ошибки выдает.
                        Вот мой код.
                        unit Unit1;

                        interface

                        uses
                        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                        Dialogs, StdCtrls, Grids,
                        Math, Ap, hblas, reflections, creflections, sblas, ablasf, ablas, ortfac, blas, rotations, bdsvd;

                        type
                        // treal2darray = array of array of double;
                        TForm1 = class(TForm)
                        StringGrid1: TStringGrid;
                        Button1: TButton;
                        Label1: TLabel;
                        StringGrid2: TStringGrid;
                        StringGrid3: TStringGrid;
                        procedure Button1Click(Sender: TObject);
                        procedure FormCreate(Sender: TObject);
                        private
                        { Private declarations }
                        public
                        { Public declarations }
                        end;

                        var
                        Form1: TForm1;
                        aa,uu,ww: TReal2DArray;
                        vt:Treal1darray;
                        implementation
                        uses svd;
                        {$R *.dfm}

                        procedure TForm1.Button1Click(Sender: TObject);
                        var
                        i,j:integer;
                        begin
                        SetLength(vt,4);
                        SetLength(ww,7,4);
                        SetLength(uu,4,4);
                        RMatrixSVD(aa,7,4,2,2,2,vt,ww,uu);

                        for I := 1 to 7 do
                        for j := 1 to 4 do
                        begin
                        StringGrid1.Cells[j,i]:=FloatToStr(vt[j-1]);
                        StringGrid2.Cells[j,i]:=FloatToStr(ww[i-1,j-1]);
                        StringGrid3.Cells[j,i]:=FloatToStr(uu[i-1,j-1]);
                        end;

                        end;

                        procedure TForm1.FormCreate(Sender: TObject);
                        begin
                        SetLength(aa,7,4);
                        aa[0,0]:=-0.022;
                        aa[0,1]:=0.0745;
                        aa[0,2]:=0.0202;
                        aa[0,3]:=-0.0624;
                        aa[1,0]:=0.0022;
                        aa[1,1]:=-0.0065;
                        aa[1,2]:=0.0319;
                        aa[1,3]:=-0.017;
                        aa[2,0]:=-0.0151;
                        aa[2,1]:=0.0332;
                        aa[2,2]:=-0.003;
                        aa[2,3]:=-0.0062;
                        aa[3,0]:=-0.0117;
                        aa[3,1]:=0.0193;
                        aa[3,2]:=0.0043;
                        aa[3,3]:=-0.0002;
                        aa[4,0]:=0.031;
                        aa[4,1]:=-0.0427;
                        aa[4,2]:=-0.0179;
                        aa[4,3]:=-0.0054;
                        aa[5,0]:=0.0184;
                        aa[5,1]:=-0.0524;
                        aa[5,2]:=-0.0216;
                        aa[5,3]:=0.0407;
                        aa[6,0]:=0.0006;
                        aa[6,1]:=-0.0446;
                        aa[6,2]:=-0.0299;
                        aa[6,3]:=0.077;
                        { aa[0,0]:=1;
                        aa[0,1]:=0;
                        aa[0,2]:=0;
                        aa[0,3]:=0;
                        aa[0,4]:=2;
                        aa[1,0]:=0;
                        aa[1,1]:=0;
                        aa[1,2]:=3;
                        aa[1,3]:=0;
                        aa[1,4]:=0;
                        aa[2,0]:=0;
                        aa[2,1]:=0;
                        aa[2,2]:=0;
                        aa[2,3]:=0;
                        aa[2,4]:=0;
                        aa[3,0]:=0;
                        aa[3,1]:=4;
                        aa[3,2]:=0;
                        aa[3,3]:=0;
                        aa[3,4]:=0;}
                        end;

                        end.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0300 ]   [ 16 queries used ]   [ Generated: 29.07.25, 12:21 GMT ]