Olimpiada AGH 2017 informatyka - pytanie o wartość ułamka zwykłego odnośnie do wyrażeń arytmetycznych

0

Cześć wszystkim

Rozwiązałem (chyba) jedno z pytań, które brzmi tak:

10. 
Rozważmy wartości wyrażeń zapisanych w języku np. C.
    A: wyrażenie 1/8*3; ma dokładnie wartość ułamka trzy ósme,
    B: wyrażenie 1/10*4; ma dokładnie wartość ułamka dwie piąte,
    C: wyrażenie 1./10*4.; ma dokładnie wartość ułamka dwie piąte,
    D: wyrażenie 3/8.*5; ma dokładnie wartość ułamka piętnaście ósmych,
    E: wyrażenie 3./8*5; ma dokładnie wartość ułamka piętnaście ósmych,
Które z powyższych zdań są prawdziwe:
a) wszystkie
b) tylko C, D i E
c) tylko D i E
d) tylko C i E

W kluczu poprawną odpowiedzią jest C, ale po przemyśleniu wyrażeń wychodziła mi odpowiedź B.
Popatrzyłem w klucz odpowiedzi i się zdziwiłem więc wykonałem test: https://wandbox.org/permlink/L3Ar30j15oiH7HPq
Z testu również wynika, że moje myślenie było poprawne. Czy prawidłowa odpowiedź może wynikać z tego, że autorowi pytania chodziło o wartość ułamka dwie piąte w postaci binarnej? Chodziło o to, że żadne wyrażenie nie da dokładnej wartości ułamka dwie piąte, bo ten ułamek jest błędnie zaokrąglany?

0

Gdzie masz w Twoim przykładzie wyrażenie 1/10*4?

0

Tego wyrażenia nawet nie sprawdzałem, bo wiadomo, że ułamek 1/10 jest błędnie zaokrąglany stąd pomnożenie go przez 4 nie da dokładnej wartości ułamka dwie piąte. Wyrażenie A zresztą to samo. Te 2 wyrażenia są brane pod uwagę tylko przy odpowiedzi a) wszystkie, a ona oczywiście jest błędna.

0

Zupełnie nie o to chodzi ;-)
1/10 = 0, bo próbujesz dzielić dwa inty; to zadanie sprawdza też wiedzę z rzutowania typów.

0

Z tego też sobie zdawałem sprawę. Wiadomo, że trzeba by te wyrażenia rzutować na double lub float jeśli już, bo przed przypisaniem to działanie jest wykonywane na typie int, który części ułamkowej nie posiada. Również dlatego testy dla tych wyrażeń odrzuciłem. Po prostu z rozpędu nie dopisałem tego w poście :)

0

Czyli jak w końcu?

Według nich D i E poprawne, a wychodzi CDE, zatem?

@Patryk27 coś miesza :P

0

Dokładnie. Kompilator pokazuje, że C, D i E są poprawne, a klucz, że D i E. W poleceniu nic nie ma właśnie o standardzie IEEE 754 napisane dlatego nie brałem na początku pod uwagę wartości binarnych ułamków przy wynikach, tylko ich wartości w systemie dziesiętnym.

Co do architektury to myślę, że autorzy pytań na tą olimpiadę układali pytania pod architekturę x86 chociaż oczywiście 100% pewności nie mam. Wydaję mi się jednak, że gdyby chodziło o inną architekturę to byłby odnośnik do niej w poleceniu pytania

5

Wszystko jest ok. A i B są błędne bo wynik to 0 bo to inty. C jest błędne bo to ułamek okresowy binarny. D i E są ok.

0

Uwagi do innych pytań z testu:

Pytanie 3:
W treści jest:

Rozważamy dowolne dwie dodatnie liczby typu zmiennoprzecinkowego takie, że f1 < f2.

Przy tym założeniu odpowiedź a) powinna być prawdziwa a reszta nierozważana. (Ewentualnie prawdziwe odpowiedzi a) i b)).
Wg klucza: b)

Pytanie 37:
W odpowiedzi c) troszkę za dużo tych zer. Dlatego prawidłowa powinna być e)
Wg klucza: c)

0

Co do pytania 37 masz rację, ale w 3 pytaniu raczej chodziło im o przykład, który zapisali poniżej. Nie zmienia to faktu, że dla niektórych takie sformułowanie pytania jest rzeczywiście mylące.

0

Mam jeszcze jedno pytanie odnośnie tego samego testu. Chodzi o o to zadanie:

18. 
Jak przeliczyć pobraną z datagramu IPv4 wartość ToS (Type of Service) na DSCP (Differential
Services Code Point)?

a) Przesunąć o dwa bity w lewo
b) To te same wartości
c) Przesunąć o dwa bity w prawo
d) DSCP znajduje się w ramce Ethernet i nie jest obliczalna na podstawie ToS

Poprawna odpowiedź to A i nie mam pojęcia dlaczego. Zestaw bitów w części Type Of Service nagłówka IPv4 wygląda tak:

0 1 2 3 4 5 6 7
DSCP ECN

6 najstarszych bitów zajmuje DSCP, 2 najmłodsze bity to ECN. Przypuśćmy, że wartością Type Of Service jest 129 w dec, czyli 10000001 więc DSCP w tym przypadku to 00100000. Test w języku C:

https://wandbox.org/permlink/oHQDLdfnaawClobJ

Jak widać wartością wyniku przesunięcia o 2 bity w lewo jest wartość 516, czyli 1000000100 co jest błędną wartością odnośnie DSCP jak widać dlatego nie rozumiem dlaczego odpowiedź A jest tutaj prawidłowa. Ja wyciągnąłbym wartość DSCP z TOS za pomocą przesunięcia bitowego i maski. Tak:

https://wandbox.org/permlink/sRDTNKraehi6MhTg

Jak widać mój program testowy generuje dobry wynik. Czy ktoś mógłby mi wytłumaczyć dlaczego przesunięcie bitowe tos << 2 jest dobrą odpowiedzią w tym przypadku? Dodam, że szukałem odpowiedzi na różnych stronach internetowych dość długo i nic nie znalazłem na ten temat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1