• 337 odgovora
  • 167.828 pregleda
Re: Kod koji daje neočekivani rezultat 14.06.2020. u 11:52 · pre 77 meseci #141
Ne znam šta se u opštem slučaju ne poklapa sa ne znam čim.

U bazama je NULL==NULL jednako NULL.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.06.2020. u 11:57 · pre 77 meseci #142
Code (c):

#include <stdio.h>

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

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

    return 0;
}
 


Rezultat je 1.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.06.2020. u 12:27 · pre 77 meseci #143
Citat:
Nedeljko:
x-x i jeste 0, bez obzira na to šta je x.

To bi trebalo da bude aritmetika u sistemu ostataka \{-2^{n-1},...,2^{n-1}-1\} po modulu 2^n. Naravno da je x-x=0.


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
Re: Kod koji daje neočekivani rezultat 14.06.2020. u 13:14 · pre 77 meseci #144
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.06.2020. u 13:36 · pre 77 meseci #145
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?
Re: Kod koji daje neočekivani rezultat 14.06.2020. u 14:09 · pre 77 meseci #146
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 15.06.2020. u 22:10 · pre 77 meseci #147
Branimir Maksimovic ne shvata da računanjem x-x nikakva provera nije moguća, pa ni provera prekoračenja.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 25.06.2020. u 09:05 · pre 77 meseci #148
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 25.06.2020. u 13:54 · pre 77 meseci #149
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 25.06.2020. u 20:10 · pre 77 meseci #150

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
Re: Kod koji daje neočekivani rezultat 27.06.2020. u 08:18 · pre 76 meseci #151
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.
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 27.06.2020. u 19:34 · pre 76 meseci #152
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 27.06.2020. u 22:24 · pre 76 meseci #153
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 :))))
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 28.06.2020. u 08:26 · pre 76 meseci #154
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 28.06.2020. u 12:14 · pre 76 meseci #155
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.
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Kod koji daje neočekivani rezultat 28.06.2020. u 14:02 · pre 76 meseci #156
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 30.06.2020. u 10:48 · pre 76 meseci #158
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.
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 30.06.2020. u 13:23 · pre 76 meseci #159
To je neočekivano ponašanje jer u standardu pišu neočekivane stvari.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 04.07.2020. u 23:09 · pre 76 meseci #160
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme