C, Obliczenie funkcji + przesunięcie bitowe.

C, Obliczenie funkcji + przesunięcie bitowe.
wahuu
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 10 lat
  • Postów:9
0

Witam

Mam problem z zadaniem:
b2.png

Rozwiązałem podpunkt a), ale nie rozumiem co trzeba zrobić z podpunktem b). Proszę o jakieś wytłumaczenie.

Podpunkt A):

Kopiuj
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

double fun (int t, double gamma);
int silnia(int a);
main()
{
printf("%lf\n",fun(2,0.7));
system("pause");      
}
int silnia(int a)
{ int odp;
    if(a>0)
    {
           odp=a*silnia(a-1);
           }
    else { 
         odp=1;
         }
return odp;
}
    
    
double fun (int t, double gamma)
{
       int j=0,pot;
       double s=1,cz;
       
       
       do{
              j=j+1;
              pot=2*j;
              cz=(1*pow(t,pot)/(silnia(pot)));
              s=s+cz;
              }
       while(cz<gamma);
return s;
}
  • b2.png (148 KB) - ściągnięć: 266
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

w matematyce m>>1 nie oznacza przesunięcia bitowego, tylko że m jest DUŻO DUŻO większe od 1 (np 1000000000)
http://pl.wikipedia.org/wiki/Lista_symboli_matematycznych

edytowany 1x, ostatnio: fasadin
wahuu
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 10 lat
  • Postów:9
0

Dzięki, główna niewiadoma rozwiązana, ale mam jeszcze wątpliwości:

  1. Dajmy na to że m=20;
    Piszę algorytm który obliczą średnią z 3 pierwszych liczb czyli od m=1 do m=3, wypisuje to, potem od m=2 do m=4 i wypisuje itd. aż do m=20?

  2. Mają być losowe wartości od -4 do 6, a linijkę niżej pisze żeby korzystać z funkcji rand(0,1) - od 0 do 1?

@adf88
Na zajęciach robiliśmy kiedyś program który też był z dokładnością i chodziło tam o dokładność własnie ostatniego wyrazu czyli program ma robić funkcje aż ostatni wyraz będzie mniejszy od np. 0,0001.

edytowany 1x, ostatnio: wahuu
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

W matematyce "m >> 1" oznacza "m dużo większe niż 1".

Pierwszą część zadania masz źle zrobioną. Ostatni wyraz szeregu jaki obliczyłeś nie jest dokładnością!
Obliczając sumę pierwszych n wyrazów dostajesz:
user image
To co nie zostało obliczone czyli reszta to
user image
Musisz liczyć dopóki nie będziesz miał pewności, że reszta jest nie większa niż ρ. Jak to określić? Musisz ograniczyć ten szereg od dołu jakąś prostszą funkcją którą będzie się dało obliczyć "od razu". Matematyka się kłania.

//EDIT
No i oczywiście user imagewięc możesz pominąć ten wyraz. Również nie obliczaj silni za każdym razem na nowo. W kolejnych krokach przemnażaj poprzednio obliczoną raz przez 2j.

//EDIT2
Musisz jeszcze określić, czy szereg jest malejący. W przeciwnym razie twój program się zawiesi, jeśli jest niemalejący.

edytowany 1x, ostatnio: adf88
wahuu
Na zajęciach robiliśmy kiedyś program który też był z dokładnością i chodziło tam o dokładność własnie ostatniego wyrazu czyli program ma robić funkcje aż ostatni wyraz będzie mniejszy od np. 0,0001.
wahuu
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 10 lat
  • Postów:9
0

Na zajęciach robiliśmy kiedyś program który też był z dokładnością i chodziło tam o dokładność własnie ostatniego wyrazu czyli program ma robić funkcje aż ostatni wyraz będzie mniejszy od np. 0,0001.
Poprawiłem na

Kopiuj
while(cz>gamma);

Dalej mam problem z typ podpunktem B, jakby ktoś umiał wytłumaczyć co ten algorytm ma robić po kolei.

edytowany 1x, ostatnio: wahuu
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1

Faktycznie jest to trochę mało sensownie napisane, ale z tego co ja zrozumiałem masz m razy wylosować t i dla każdego takiego t obliczyć średnią pierwszych trzech wyrazów ciągu (w sumie nie jest napisane czy to mają być pierwsze trzy czy dowolne inne trzy wyrazy, byle kolejne, może jakiś diabeł tam się kryje...).
//EDIT
W sumie chyba wiem o co chodziło pytającemu (ach, jak ja lubię rozszyfrowywać pytania...). Prawdopodobnie masz wylosować t, obliczyć średnią z pierwszych trzech wyrazów ciągu, wylosować kolejne t, obliczyć średnią z kolejnych trzech wyrazów ciągu (ale już z nowym t), wylosować kolejne t ... i tak m razy. Pewności nie mam.

edytowany 1x, ostatnio: adf88
wahuu
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 10 lat
  • Postów:9
0

Dodam że w drugiej grupie jest polecenie "Podaj algorytm, który obliczy trzy kolejne maksymalne wartości f(t)..."

Niezrozumiałe polecenie, a jutro mam poprawke...

edytowany 1x, ostatnio: wahuu
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Zgadzam się z adf88 - wg mnie zadanie jest celowo niezbyt poprawnie sformułowane:
a) wstęp to równoważnik zdania a nie zdanie - powinno być jak rozumiem "Dana jest zależność wartości f(t), m - liczba całkowita i gamma - liczba rzeczywista"
b) szereg nieskończony niepotrzebnie jest podany jako nieskończony skoro mamy obliczyć jego 3 kolejne elementy
c) z drugiej strony mamy liczyć do osiągnięcia określonej dokładności

Wg mnie w zadaniu jest wewnętrzna sprzeczność m. (b) i (c).

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

Albo jeszcze inaczej?

Podaj algorytm, który obliczać będzie średnie z trzech kolejnych wartości f(t).
Może wcale nie chodzi o 3 kolejne wyrazy szeregu. Może trzeba obliczyć f(t) z zadaną dokładnością dla trzech różnych t i wyciągnąć średnią? K*** sam już nie wiem, obstawał bym przy tym ostatnim.

wahuu napisał(a):
  1. Mają być losowe wartości od -4 do 6, a linijkę niżej pisze żeby korzystać z funkcji rand(0,1) - od 0 do 1?
    Pomnóż wynik rand'a (0..1) przez 10 (wyjdzie 0..10) i odejmij 4 (wyjdzie -4..6).
edytowany 4x, ostatnio: adf88
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
0

te m to dziwna sprawa, wiadomo, że m jest całkowite i dużo większe od 1, ale we wzorze go nie widać i nie widzę by miało jakikolwiek wpływ na wynik obliczeń.
Nic tyko zignorować m i wtedy zadanie jest jasne: obliczyć f(t) dla trzech wartości t z zdaną dokładnością.
Na dodatek te (-1)^(2j) to już totalny bezsens (zawsze równe 1). Coś mi się wydaje, że zadanie ma za dużo literówek zmieniające sens zadania.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
wahuu
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 10 lat
  • Postów:9
0

Wykombinowałem takie coś:
Podaje m liczb które ma wylosować z przedziału <-4,6> - to są "t".
Potem liczy funkcje f(t) dla pierwszych 3 wyrazów i sprawdza jaka jest ich średnia.
Pewnie nie o to chodzi bo w drugiej grupie ma obliczyć jakieś elementy maksymalne, a inne zadania są bardzo podobne między grupami typu inne potęgi itp.

Listing:

Kopiuj
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void wtfb (int m);
int silnia(int a);
main()
{
      
wtfb(8);
system("pause");      
}
int silnia(int a)
{ int odp;
    if(a>0)
    {
           odp=a*silnia(a-1);
           }
    else { 
         odp=1;
         }
return odp;
}
void wtfb (int m)
{
     double sr;
     int i,t;
     
                       for (i=0;i<m;i++)
                       {   
                           t=rand()%11-4;
                           int j=0,pot;
                           double s=1,cz;
       
       
                                  while(j<3){
                                  j=j+1;
                                  pot=2*j;
                                    cz=(1*pow(t,pot)/(silnia(pot)));
                                                s=s+cz;
                                    }
                                    
                                    printf("srednia f(%d)=%lf\n",t,s/3);
                         }     
return 0;
}        

Pisane na szybkiego więc coś może się nie zgadzać.

Przyklad przy m=20:
przykl.png

edytowany 1x, ostatnio: wahuu
MarekR22
kto powiedział, że t ma być całkowite?
wahuu
Nikt, ale definicja rand() mówi "Funkcja rand() zwraca kolejną pseudolosową liczbę całkowitą..."
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

rand()%11-4;
W ten sposób wylosujesz jedynie liczby całkowite. Dla liczb rzeczywistych (sugeruje to zapis rand()∈(0,1)) Powinno być:
10.0 * rand() / RAND_MAX - 4

No i ogólnie kiepsko to napisane. W zasadzie kompletne minimum. Przede wszystkim można ulepszyć obliczanie silni. Nie licz iloczynu od nowa za każdym razem, skorzystaj z tego, co obliczyłeś do tej pory. Wtedy zamiast n*n mnożeń wykonasz tylko n mnożeń.

Zamiast

Kopiuj
for(j = 0; ; j++) {
   double silnia = oblicz_silnie(2 * j);
   /* ... */
}

wystarczy

Kopiuj
double silnia = 1;
for(j = 0; ; j++) {
   /* ... */
   silnia *= (2 * j + 1) * (2 * j + 2);
}
edytowany 5x, ostatnio: adf88
adf88
Uwaga! Wprowadziłem poprawkę do kodu na silnię.
MarekR22
raczej silnia *= 2 * (j - 1) * 2 * j i zacząć pętlę od 1
adf88
No właśnie chciałem, aby pętla szła od 0 żeby nie mieszać już bardziej i żeby 'j' pokrywało się z tym 'j' ze wzoru.
adf88
Zresztą to co proponujesz jest błędne. Jak zaczniemy pętle od 1 to z (j - 1) wyjdzie 0 i nam się silnia wyzeruje w pierwszym kroku.
MarekR22
źle nawias postawiłem , powinien być: silnia *= (2 * j - 1) * 2 * j
OA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:95
1
png.latex?%5Csum_%7Bj%3D0%7D%5E%7B%5Cinfty%7D%20(-1)%5E%7B2j%7D%5Cfrac%7Bt%5E%7B2j%7D%7D%7B(2j)!%7D%20%3D%20%5Csum_%7Bj%3D0%7D%5E%7B%5Cinfty%7D%20%5Cfrac%7Bt%5E%7B2j%7D%7D%7B(2j)!%7D%20%3D%20%5Csum_%7Bk%3D0%2C2%2C4%2C6%2C...%7D%5E%7B%5Cinfty%7D%20%5Cfrac%7Bt%5Ek%7D%7Bk!%7D%20%5C%5C%20%5Ctextup%7BTeraz%20znajdujemy%20zale%C5%BCno%C5%9B%C4%87%20mi%C4%99dzy%20kolejnymi%20wyrazami%20aby%20przyspieszy%C4%87%20obliczenia%7D%5C%5C%20a_k%20%3D%20%5Cfrac%7Bt%5Ek%7D%7Bk!%7D%20%5C%5C%20a_%7Bk%2B2%7D%20%3D%20%5Cfrac%7Bt%5E%7Bk%2B2%7D%7D%7B(k%2B2)!%7D%20%3D%20%5Cfrac%7Bt%5Ek%7D%7Bk!%7D%5Ccdot%5Cfrac%7Bt%5E2%7D%7B(k%2B1)(k%2B2)%7D%20%3D%20a_k%5Ccdot%5Cfrac%7Bt%5E2%7D%7B(k%2B1)(k%2B2)%7D

EDIT: A tak naprawdę, ta suma to rozwinięcie funkcji cosh(t)
png.latex?f(t)%20%3D%20%5Csum_%7Bk%3D0%2C2%2C4%2C6%2C...%7D%5E%7B%5Cinfty%7D%20%5Cfrac%7Bt%5Ek%7D%7Bk!%7D%20%3D%20%5Csum_%7Bk%3D0%7D%5E%7B%5Cinfty%7D%20%5Cfrac%7B1%5Ek%2B(-1)%5Ek%7D%7B2%7D%5Ccdot%20%5Cfrac%7Bt%5Ek%7D%7Bk!%7D%20%3D%20%5Cfrac12%20%5Csum_%7Bk%3D0%7D%5E%7B%5Cinfty%7D%20%5Cleft%20(%20%5Cfrac%7Bt%5Ek%7D%7Bk!%7D%2B%5Cfrac%7B(-t)%5Ek%7D%7Bk!%7D%20%5Cright%20)%20%3D%20%5Cfrac12%20%5Cleft%20(%20e%5Et%20%2B%20e%5E%7B-t%7D%20%5Cright%20)%20%3D%20%5Ccosh(t).

Kopiuj
#include <cstdio>
#include <cmath>
#include <cassert>


double f(double t, double delta) {
    assert(delta > 0);
    const double t2 = t*t;
    double ak = 1.0;        // ak > 0 dla kazdego k parzystego
    double sum = ak;

    for (int k = 0; ak > delta; k += 2) {
        ak *= t2/((k+1)*(k+2));
        sum += ak;
    }

    return sum;
}

bool isCorrect(double t, double delta) {
    return delta < 0  ||  fabs(cosh(t) - f(t,delta)) < delta;
}

void testCorrectness() {
    unsigned long passed = 0;
    unsigned long failed = 0;

    for (double t = -10.0; t < 10.0; t += 0.01)
        for (double delta = 0.000000001; delta < 1; delta *= 10)
            if (isCorrect(t,delta)) {
                passed++;
            } else {
                failed++;
                printf("FAIL: for t == %g, delta == %g\n"
                       "  expected %g, but was %g\n",
                       t, delta, cosh(t), f(t,delta));
            }

    printf("Ran %lu tests.\n", passed+failed);
    if (failed == 0)
        puts("OK.");
    else
        printf("%lu of them failed! (%lu passed).\n", failed, passed);
}

int main() {
    testCorrectness();
}
edytowany 1x, ostatnio: Oak
wahuu
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 10 lat
  • Postów:9
0

Wielkie dzięki za pomoc, egzamin napisany, wydaje mi się że zdam ;)
Pozdrawiam

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)