Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kod koji daje neočekivani rezultat

[es] :: Art of Programming :: Kod koji daje neočekivani rezultat

Strane: << < .. 3 4 5 6 7 8 9 10 11 12 ... Dalje > >>

[ Pregleda: 107601 | Odgovora: 337 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.06.2020. u 11:52 - pre 45 meseci
Ne znam šta se u opštem slučaju ne poklapa sa ne znam čim.

U bazama je NULL==NULL jednako NULL.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.06.2020. u 11:57 - pre 45 meseci
Code (c):

#include <stdio.h>

int main() {
    int x = 641, y = 6700417;

    printf("%d\n", x*y);

    return 0;
}
 


Rezultat je 1.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat14.06.2020. u 12:27 - pre 45 meseci
Citat:
Nedeljko:
x-x i jeste 0, bez obzira na to šta je x.

To bi trebalo da bude aritmetika u sistemu ostataka po modulu . Naravno da je .


Jel? A gle ovo:

Code:

f:
.LFB11:                                                                                               
    .cfi_startproc                                                                                   
    movl    $0, %eax                                                                             
    ret                                                                                                  
    .cfi_endproc 



Na ovo:
Code:

int f(int x) {
     if (x + 100 < x ){
         printf("overflow\n");
         return 1;
     }
     return 0;
}


Znaci potpuno izbacuje kod koji ne moze da se desi :P
x-x ako racuna ne moze biti 0 nikako, a uzmi bilo koji kod koji racuna da ce biti overflow bice
izbacen:P
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.06.2020. u 13:14 - pre 45 meseci
1. x+100<x može da bude tačno za neke x.

2. x-x ako se računa, mora biti 0 za svako x. Sedi, pa računaj.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat14.06.2020. u 13:36 - pre 45 meseci
Dakle ti ne shvatas da kompajler izbacuje kod koji proverava overflow?

Ako proveru x!=-x stavi da je netacno a x-x == 0 da je tacno to ne valja, ili mislis drugacije?

Ne shvatas da je potpuno izbacio proveru x+100 < x?
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.06.2020. u 14:09 - pre 45 meseci
x!=-x je nekada tačno, a nekada netačno. Za x==0 i x==INT_MIN je tačno, a za ostale vrednosti je netačno.

x-x=0 je tačno za sve vrednosti x i može se zameniti nulom. Ne može jedino f(x)-f(x) jer f može da ima bočne efekte ili x-x za volatile x jer čitanje dva puta ne mora da da istu vrednost. Ne znam odakle ti da uplićeš x-x u ovo.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat15.06.2020. u 22:10 - pre 45 meseci
Branimir Maksimovic ne shvata da računanjem x-x nikakva provera nije moguća, pa ni provera prekoračenja.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat25.06.2020. u 09:05 - pre 45 meseci
Inače, rešenje za ove budalaštine je u slučaju GCC-a sledeći switch: -fwrapv. Na clang-u je sve u redu.

Ima li još ovakvih budalaština, da znam šta me čeka.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat25.06.2020. u 13:54 - pre 45 meseci
Code (c):

#include <stdio.h>

#define TEST(x) printf("%s\n", (x) ? "Yes" : "No");

int main()
{
     int x = 2000000000;

    TEST(x+1000000000<x);
    TEST(x+1000000000u<x);
    x = 1<<31;
    TEST(x==-x);
    TEST(x-x==0);

    return 0;
}


U prvom testu se bez optimizacije dobija ispravan odgovor Yes, a sa optimizacijom đene-đene. Sa -fwrapv se takođe dobija "Yes". U drugom testu se dobija No, bez obzira na sve. U trećem i četvrtom testu se dobija ispravan odgovor Yes, bez obzira na sve.

Dakle, zbir označenog i neoznačenog broja je neoznačen, pr čemu nema upozorenja da se porede označen i neoznačen broj.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
*.dynamic.sbb.rs.



+61 Profil

icon Re: Kod koji daje neočekivani rezultat25.06.2020. u 20:10 - pre 45 meseci

gcc -Wall -Wextra -fwrapv test.c -o test
test.c: In function ‘main’:
test.c:10:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
TEST(x+1000000000u<x);
^
test.c:3:33: note: in definition of macro ‘TEST’
#define TEST(x) printf("%s\n", (x) ? "Yes" : "No");
^


-Wextra je neophodno uključiti za upozorenje
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat27.06.2020. u 08:18 - pre 45 meseci
Eto ipak je bilo neocekivano. Ima puno takvih stvari, ali to je zato sto ti zamisljas C kao neki mocni jezik, a on je samo malo jaci makroasembler ;)))). Dobro puno jaci.
CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat27.06.2020. u 19:34 - pre 45 meseci
Ja bih voleo da je to tako, ali nije.

Ja bih hteo jezik bez tih cpanja, a da je ono što C treba da bude.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat27.06.2020. u 22:24 - pre 45 meseci
C je bas ono sto treba, nema sranja, tako masina racuna, on to prepusta procesoru, ne upusta se u proracun. Ako zelis ti nesto specijalno presretni, ali ne kukaj kako je posle sporo :).

Zato C i jeste zamisljen kao jak asembler, zato je i potreban, zato je i brz, zato je i zanimljiv, nema puno proseravanja ala klasice i neke glupe zabrane ili ona proseravanja sa funcionalnim glupostima :).

A neocekivoanosti, pa i nisu za one koji su citali standard :).

Sedi i napravi svoj jezik, ja jesam moj, ali je sada smesan, 95-e je bio zanimljiv :))))
CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat28.06.2020. u 08:26 - pre 45 meseci
Citat:
chupcko: ...tako masina racuna, on to prepusta procesoru, ne upusta se u proracun.

Problem je u tome što nije tako. Kada se bukvalno prevede na asembler, dobije se drugačiji rezultat.
Citat:
chupcko: Ako zelis ti nesto specijalno presretni, ali ne kukaj kako je posle sporo :).

Optimizacije ne smeju da promene rezultat.
Citat:
chupcko: Sedi i napravi svoj jezik

Pa, napravio sam za pare kad je neko tražio i u upotrebi je.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2679



+690 Profil

icon Re: Kod koji daje neočekivani rezultat28.06.2020. u 12:14 - pre 45 meseci
Citat:
Nedeljko:
Code (c):

#include <stdio.h>

int main() {
    int x = 641, y = 6700417;

    printf("%d\n", x*y);

    return 0;
}
 


Rezultat je 1.

Zavisi od kompajlera, proveri npr. na nekom online interpreteru, vratiće grešku, jer je pređena vrednost 2^32 (ako se kompajlira u 32-bitni kod), i to tačno za 1.

Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat28.06.2020. u 14:02 - pre 45 meseci
Zabole me za onlajn kompajlere. Stavi unsigned umesto int i onda je po C standardu, pod pretpostavkom da je taj tip veličine 32 bita.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat28.06.2020. u 20:08 - pre 45 meseci
Nedeljko:"Optimizacije ne smeju da promene rezultat."

Osim ako se ne radi o UB-u, kada mogu.
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat30.06.2020. u 10:48 - pre 45 meseci
Eh, dosli smo do sustine teme:

Ako optimizujes UB i dobijes UB, sto se bunis :)

Na svu srecu dobri programeri pisu i testove svog koda, pa na neki nacin kontrolisu UB :)

Da li ima neki kod koji je neocekivan a da nije posledica UB?

Recimo neka sitna stavka u dokumentaciji koju niko ne cita?
Za vecinu ljudi je neocekivano videti nesto tipa: 2["abcdef"] u c-u, ali to je pokriveno standardom i izuzetno neprakticno, osim ako ne zelis da zezas juniore.

CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat30.06.2020. u 13:23 - pre 45 meseci
To je neočekivano ponašanje jer u standardu pišu neočekivane stvari.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat04.07.2020. u 23:09 - pre 45 meseci
Evo šta daje neočekivan rezultat:

Code:
-22%10


Umesto 8, dobiće se -2, jer je neki "genije" iz IEEE-ja mislio da to treba da se slaže sa promenom znaka. Pritom, u računu ostataka primenu ima račun sa potpunim sistemom ostataka, kao što je 0,...,n-1 ako se računa ostatak pri delenju sa n, dok "slaganje sa promenom znaka" nema nikakvu primenu.

To je što bi jedan pokojni profesor rekao "kad moleri prave hemiju", što mu je bio izraz za šarlatanstvo, diletantstvo.

Zatim, IEEE je uveo dve nule u IEEE 754 standard. Jedna je negativna, a druga ima dva značenja - pozitivna i čista nula, što takođe nema primenu. Ivan Dimković me je nekada ubeđivao da je za multimediju bolje da bude glupost, nego NaN, što možda koristi da dekodiranje zvuka i šteti za sve ostalo.

Naravno, te budalaštine su ugrađene u hardver.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: Art of Programming :: Kod koji daje neočekivani rezultat

Strane: << < .. 3 4 5 6 7 8 9 10 11 12 ... Dalje > >>

[ Pregleda: 107601 | Odgovora: 337 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.