eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJak zacząć pracę z Fortranem?Re: Jak zacząć pracę z Fortranem?
  • Data: 2016-09-16 12:53:17
    Temat: Re: Jak zacząć pracę z Fortranem?
    Od: Borneq <b...@a...hidden.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu 15.09.2016 o 23:04, Sebastian Biały pisze:
    > Kiedyś faktycznie był szybki, ale ostatnio widzę że istnieje bardziej na
    > zasadzie inercji: jest bo jest w nim jakiś soft numeryczny i jakoś tak
    > wychodzi. Czy *obecnie* fortran jest szybszy niż identyczny algorytm w C
    > i co najwazniejsze: niby dlaczego?

    Obecne C/C++ jest szybkie do kresu możliwości.Sprawdzałem w VC 2015 w
    Release:
    Wyliczałem Hornerem :
    obliczanie przyblizenia Czebyszewa exp(x) wielomianem
    stopnia 7; wielomian obliczany schematem Hornera
    oraz szybsz? metod?

    double horner(double x)
    {
    double result = 0.0002047;
    result = result*x + 0.001439274;
    result = result*x + 0.008328596;
    result = result*x + 0.041635012;
    result = result*x + 0.166667986;
    result = result*x + 0.500006347;
    result = result*x + 0.999999901;
    result = result*x + 0.999999801;
    return result;
    }

    double hornerfast(double x)
    {
    return ((((((0.0002047*x + 0.001439274)*x + 0.008328596)*x
    + 0.041635012)*x + 0.166667986)*x + 0.500006347)*x + 0.999999901)*x +
    0.999999801;
    }

    oraz dla porównania metodą szybsza od Hornera:
    double fast(double x)
    {
    double y = x*0.297178123 + 0.155642921;
    double z = y*y;
    return (z + 0.732273642600117)*(y*((z + 2.4368618551)*(z + y -
    1.0184605924)
    + 5.2036422682) + 1.5688833150) - 0.5565483727;
    }


    Przed laty pisałem coś takiego w Pascalu
    i horner na Duronie 900 miał 190 taktów, hornerfast na Duronie 900 miał
    72 takty a fast
    na Duronie 900 miał 105 taktów, a 160 gdy "linie nie były polaczone ze sobą"
    Czyli zależność procedury od tego czy ją się napisze w jednej linii a
    poza tym nowa metoda fast gorsza od szybszego Hornera mimo że mniej mnożeń.
    Spowodowane to było małą optymalizacją.
    W C++ zupełnie co innego, pętla 20000000:
    horner 68.82 ms
    hornerfast 68.9 ms
    fast 68.19 ms
    Wszystkie tak samo, niestety szybsza metoda niż Hornera tu nie działała
    chyba stopień 7 to za mało, trzeba by z 12.
    Uwaga: Gdy wykonywałem pomiar czasu za pomocą std::chrono biorąc większą
    lub mniejsza pętlę było źle, bo im większa pętla tym mniej na jedną
    funkcję. Więc wziąłem nie największą pętlę i jeszcze ją wykonałem 100
    razy biorą NAJMNIEJSZY rezultat a nie średni. Bywało źle, bo za
    pierwszym razem wykonywało się zwykle najwolniej, potem z 5 razy
    szybciej ale jeszcze nie tak, potem już tak samo.

    WNIOSEK: C++ jest tak szybkie, że nie trzeba się już przejmować postacią
    procedury.
    ALE z drugiej strony stopień 7 wielomianu to za mało aby zadziałała
    skomplikowana metoda, która miała przyśpieszyć Hornera.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: