На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Точность вычислений. Метод Гаусса
    Цитата Majestio @
    И так. Число 10 делим на 3, делим, делим, делим, а потом умножаем на то же 3. Барабаны, фейерверки ... и получаем число 9. Аплодисменты и занавес!
    Ну так ты заюзал целочисленный класс. Юзай вещественный.
      Цитата Qraizer @
      Ну так ты заюзал целочисленный класс. Юзай вещественный.

      Заюзал, но ... от перемены мест слагаемых - легче не становится! :lol:

      ExpandedWrap disabled
        #include <gmp.h>
         
        int main() {
            mpf_t a, b, result;
            mpf_init(a);
            mpf_init(b);
            mpf_init(result);
         
            mpf_set_d(a, 234777440777777777777777777777777777777.7324856732495879347856398564739865473986739658739867398657349856734589673463371);
            mpf_set_d(b, 17.0);
         
            mpf_div(result, a, b);
            mpf_mul_ui(result, result, 17.0);
         
            gmp_printf("Qraizer, you should be sad: %.1Ff\n", result);
         
            mpf_clear(a);
            mpf_clear(b);
            mpf_clear(result);
         
            return 0;
        }

      ExpandedWrap disabled
        Qraizer, you should be sad: 234777440777777784841000000000000000000.0

      Не, ну может я где и накосячил - заюзал впервые либу вчера! Но как-то не впечатляет пока :rolleyes:
        Нужную точность забыл выставить.
        P.S. Я gmp тоже в глаза не видел до этой темы. Сужу исключительно по мануалам.

        Добавлено
        Ну так, положу тут просто.
        ExpandedWrap disabled
          #include <iostream>
          #include <iomanip>
          #include <boost/multiprecision/cpp_bin_float.hpp>
           
          namespace bmp = boost::multiprecision;
          using longlongFloat = bmp::number<bmp::cpp_bin_float<400>>;
           
          int main()
          {
            longlongFloat a, b, result;
           
            a = longlongFloat("234777440777777777777777777777777777777.7324856732495879347856398564739865473986739658739867398657349856734589673463371");
            b = 17.0;
           
            result = a / b;
            result*= 17.0;
           
            std::cout << "Are you fun now, Majestio? " << std::setprecision(120) << std::scientific
                      << result << std::endl;
          }
          Qraizer, я в той же теме не так же плотно! Надо просто замутить стресс-тесты на числа "до запятой" порядка 5000-7000, и после запятой. Провести деление и умножение е на три. И оценить потом то, что преобразуется.
            Вот конкретный пример, который у меня вызвал трудности.
            Прикреплённая картинка
            Прикреплённая картинка

            MathCAD как и ожидалось считает Result с большой точностью после запятой
            Хотелось бы сделать такую же функцию lsolve(A,B)
            моя выдает 9999, ... можно конечно округлить, но где гарантия что для другого случая не затрется нужная цифра.
            Сообщение отредактировано: H g -
              Кто-нибудь пробовал GSL ?
              https://ru.wikipedia.org/wiki/GNU_Scientific_Library

              Там по документации есть функция gsl_linalg_HH_solve()

              Документация:

              https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf
              Сообщение отредактировано: H g -
                метод Гаусса-Зейделя подходит, повышает точность.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0338 ]   [ 19 queries used ]   [ Generated: 18.09.24, 16:04 GMT ]