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: << < .. 4 5 6 7 8 9 10 11 12 13

[ Pregleda: 69244 | Odgovora: 242 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mjanjic
Šikagou

Član broj: 187539
Poruke: 1824



+532 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 01:33 - pre 38 dana i 17h
Kod Python-a su ostavili obe mogućnosti, operator % za operande različitog znaka daje rezultat koji ima isti znak kao drugi operand, dok fmod iz math biblioteke daje obrnuto, odnosno ostatak koji je istog znaka kao prvi operand, kao što je dato u primerima ovde: https://www.askpython.com/python/python-modulo-operator-math-fmod
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
109.72.51.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 02:30 - pre 38 dana i 16h
Stvar je u tome da je u C-u % remainder operator, not moduo.

Recimo u Rustu ima:
Code:

fn main() {
    println!("{} {}",(-22)%10,(-22i32).rem_euclid(10));
}


koji daje oba rezultata:
Code:

~/.../examples/rust >>> ./unex                                                                                                                                                                           
-2 8



press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 05:50 - pre 38 dana i 13h
Da li ti znaš šta je to remainder ili ostatak?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
109.72.51.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 09:17 - pre 38 dana i 9h
Ocigledno se racuna kao ostatak:
Code:

    let rem = | x , y | x - (x/y)*y;


press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 10:53 - pre 38 dana i 7h
Pojam ostatka se ne definiše programskim jezicima, već teoremom o euklidskom delenju.

Neka su i celi brojevi takvi da je . Tada postoje jednoznačno određeni celi brojevi i takvi da važi

, .

Pritom, broj zovemo ostatkom pri delenju broja brojem .

Naravno, umesto skupa , moguć je i drugi izbor sistema ostataka, ali on treba da ima elemenata i razlika bilo koja dva elementa tog skupa ne sme biti deljiva sa .

Programski jezici treba da se usklađuju sa time, jer je to plod mnogovekovnog matematičkog iskustva, da je tako praktičnije. Sve teoreme se odnose na to i tako se radi lakše.
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: 8377
*.dynamic.isp.telekom.rs.



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 10:55 - pre 38 dana i 7h
Što se neočekivanog ponašanja tiče, može li neko da navede situaciju kada je implementacija u C-u na način koji je uobičajen za C sporija od implementacije u Javi ili C#-u, na način koji je uobičajen za njih?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
109.72.51.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 11:13 - pre 38 dana i 7h
"Pojam ostatka se ne definiše programskim jezicima, već teoremom o euklidskom delenju."

Ocigledno ne. Zato Rust ima i rem_euclid f-ju. Gleda se prakticna primena na hardveru.
press any key to continue or any other to quit....
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
109.72.51.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 11:15 - pre 38 dana i 7h
Citat:
Nedeljko:
Što se neočekivanog ponašanja tiče, može li neko da navede situaciju kada je implementacija u C-u na način koji je uobičajen za C sporija od implementacije u Javi ili C#-u, na način koji je uobičajen za njih?


Pa pazi ako je deljenje konstantnom onda je verovatno optimizovano kao shift i multiply u svim tim jezicima. Stara verzija Jave nije to radila pa je C bio brzi, za C# ne znam.

press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 11:45 - pre 38 dana i 7h
Hardver su očigedno pravili kako ne treba, to jest na način koji je manej praktičan, a onda kad je tako kako jeste, onda su softveraši dovedeni pred svršen čin, pa

- prave funkcije koje se direktno oslanjaju na hardver, jer su brze, budući da su hardverski implementirane, a vrše posao u slučeju nenegativnih operanada,

- prave dodatne funkcije, koje nisu toliko brze jer nisu hardverski implementirane, ali vrše posao u široj klasi slučajeva.

Da li neko zna primenu za -2%10==-2? Ja znam primene za -2%10==8.

Code (c):

int euc(int a, unsigned int b, int *q, unsigned int *r)
{
    if (b==0) return 0;

    if (b==-1 && a==INT_MIN) {
        return 0;
    }

    *q = a/b;
    *r = a-*q*b;

    if (*r<0) {
        if (b>0) {
            *r += b;
            --q;
        } else {
            *r -= b;
            ++q;
        }
    }

    return 1;
}
 


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: 8377
*.dynamic.isp.telekom.rs.



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 12:44 - pre 38 dana i 6h
Citat:
Nedeljko: Što se neočekivanog ponašanja tiče, može li neko da navede situaciju kada je implementacija u C-u na način koji je uobičajen za C sporija od implementacije u Javi ili C#-u, na način koji je uobičajen za njih?


Što se ovog pitanja tiče, mislio sam na sledeće:

Ako treba da optimizujemo program tako da u dugim periodima obavi što veću količinu posla u odnosu na utrošeno vreme, da li je GC koji odloženo čisti đubre efikasniji od free, koji briše komad po komad? Recimo da imamo veliki broj alokacija i dealokacija.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

chupcko
Ima
Beograd

Član broj: 5560
Poruke: 1138

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat05.07.2020. u 23:16 - pre 37 dana i 19h
Eh, tako je kada neko ne nauci lepo istoriju racunarstva i misli da je racunarstvo u sluzbi matematike :))))))).

To sto ti ocekujes da masine prate tvoju matematiku, to je tvoj problem, cinjenica je da masine imaju svoja definisana pravila, pa na tebi je da ih naucis i koristis kako tebi treba :)))))))))).
A kao sto jednom rekoh: C je samo dosta dobar makroasembler ;)))) Prati masinu a ne ljude ;)


CHUPCKO
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
109.72.51.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 02:31 - pre 37 dana i 16h
Citat:
Nedeljko:
Citat:
Nedeljko: Što se neočekivanog ponašanja tiče, može li neko da navede situaciju kada je implementacija u C-u na način koji je uobičajen za C sporija od implementacije u Javi ili C#-u, na način koji je uobičajen za njih?


Što se ovog pitanja tiče, mislio sam na sledeće:

Ako treba da optimizujemo program tako da u dugim periodima obavi što veću količinu posla u odnosu na utrošeno vreme, da li je GC koji odloženo čisti đubre efikasniji od free, koji briše komad po komad? Recimo da imamo veliki broj alokacija i dealokacija.


Svakako da GC nije efikasniji od rucne dealokacije tim pre sto je to thread koji to radi dok se program izvrsava. Znaci postoje dva pristupa: da zaustavi program pa to odradi ili da pravi membarove cime se drasticno
usporava pristup memoriji. U svakom slucaju Rust je u pocetku imao GC, ali su ga odbacili zbog performansi. Nema besplatnog rucka, pa tako convenience da ne moras da pazis kada sta oslobadjas
ima svoju (veliku) cenu.

press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 08:13 - pre 37 dana i 10h
chupcko

Nije to moja matematika, već matematika mnogih vekova izučavanja od strane velikih umova, koji su došli do toga šta je primenljivije, lakše i elegantinije.

Kapiram ja da C prati hardver, ali se onda postavlja pitanje zašto je hardver takav.

Niko da pruži odgovor na ključno pitanje. Koje su primene za -2%10==-2? Primena za -2%10==8 je na primer određivanje koliko je dana proteklo između dva datuma u nekakvom proleptičkom kalendaru.


Branislav Maksimovic

Hvala. Upravo sam to želeo da čujem, ali nisam siguran da je odgovor tačan, pa bi želeo malo podrobnije obrazloženje. Dakle, GC se pali ponekad, retko. Kada se upali, on svakako oduzme neko vreme, što nije podesno za real time. Međutim, ako aplikacija nije real time, obzirom da se GC retko pali (i još postoje optimizacije sa generacijama objekata), da li je u dugom vremenskom intervalu ukupno potrošeno vreme alokaciju i dealokaciju kraže u slučaju GC-a ili u slučaju ručnog brisanja?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
82.117.201.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 08:19 - pre 37 dana i 10h
Nedeljko:"da li je u dugom vremenskom intervalu ukupno potrošeno vreme alokaciju i dealokaciju kraže u slučaju GC-a ili u slučaju ručnog brisanja?"

Nije problem ukupno potroseno vreme nego, kao sto sam naveo, to sto program dok traje dealokacija mora da se zaustavi sto jako
boli u vreme kada imas 64 kora ili mora da ima konstantno usporenje zbog membarova koje moraju non stop da se postavljaju
prilikom svakog pristupa objektima. Eto recimo imas 64 threada koji bi nesto radili, ali dealokacija ih sve zaustavi. Kod
rucne dealokacija toga nema zato sto cak i najprostiji alokator ce blokirati na lok samo threadove koji alociraju ili dealociraju
u istom trenutku, obaska sto imas one alokatore koji su lock free.
press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 08:27 - pre 37 dana i 10h
Dobro, recimo da imam 4 jezgra ili 2 jezgra. Postoji li slučaj kada će program da obavi više posla ako koristim na primer Boehm GC u C-u ili malloc/free/realloc u C-u? Dakle, u slučaju da imam mali broj jezgara itd.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
87.116.183.*



+61 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 09:17 - pre 37 dana i 9h
Ako smem samo da dodam, jos jedan problem sa GC-om je sto ne znamo kad ce tacno da odradi posao.

Zauzece memorije moze biti poprilicno dok se GC (napokon) aktivira.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2716 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 09:23 - pre 37 dana i 9h
Ma, to je problem za real time. Ne pričamo o real time aplikacijama. Ja pitam da li postoji slučaj kada je efikasniji. Naveo sam na šta se odnosi.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
82.117.201.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 09:43 - pre 37 dana i 9h
Citat:
Nedeljko:
Dobro, recimo da imam 4 jezgra ili 2 jezgra. Postoji li slučaj kada će program da obavi više posla ako koristim na primer Boehm GC u C-u ili malloc/free/realloc u C-u? Dakle, u slučaju da imam mali broj jezgara itd.


GC ima dodatni posao da locira sve reference koje moze osloboditi. Klasican alokator to nema nego tacno 1 oslobadja.
Boehm GC ima jos problem sto ne moze razlikovati int od pointera tako da moze da se desi da se napravi memleak
ukoliko se desi da neki od intova ima isti sadrzaj kao pokazivac. Osim toga kod GC-a ne smes da se igras sa pointerima,
da shiftujes andujes i slicne rabote. (to mislim na BoehmGC koji radi sa C/C++).

press any key to continue or any other to quit....
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1928
54.239.6.*

Sajt: stackoverflow.com/users/1..


+473 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 11:35 - pre 37 dana i 7h
Citat:
Ako treba da optimizujemo program tako da u dugim periodima obavi što veću količinu posla u odnosu na utrošeno vreme, da li je GC koji odloženo čisti đubre efikasniji od free, koji briše komad po komad?


Ako je program napravljen ovako:

Code:

void foo() {
    auto* ptr = allocator.allocate(size);
    // posao
    allocator.deallocate(ptr, size);
}

void foo_gc() {
    auto* ptr = gc.allocate(size);
    // posao
}


Ako se obe funkcije pozivaju isti broj puta na sledeći način:

Code:

for (int i = 0; i < N; i++) foo_gc();


i količina slobodne memorije je tolika da GC ne mora da čisti za sobom, sve su šanse da će program sa GC raditi brže. Čak i ukoliko GC ima potrebu da očisti memoriju, GC će samo proći po steku, videti samo jedan pokazivač (samo jedan ptr je živ, samo se on obilazi, ostali su nedostižni) i svu ostalu memoriju osloboditi u jednom potezu. U tom slučaju je praćenje referenci trivijalno, jer je stek mali, pa je cena toga amortizovana. Takođe, što je manja alokacija, to manje đubreta, iz čega sledi što više GC allokacija pre nego što si prinuđen da očistiš đubre.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4546
82.117.201.*



+947 Profil

icon Re: Kod koji daje neočekivani rezultat06.07.2020. u 11:45 - pre 37 dana i 7h
Ovo ces moci zakljuciti tek onda kada je N dovoljno veliko da se dealokacija izvrsi nekoliko puta. Pri tom ako to sto
alociras u sebi ima reference GC ce svakako da bude sporiji, zato Boehm ima markiranje alocirane memorije da ne
sadrzi pointere. U jezicima koji su GC friendly ne moras da se bavis time...
No pazi sad, a sta cemo sa .NET GC-om koji je compacting, to znaci da mora da iskopira heap pa apdejtuje *sve
reference* u programu.
Generalno GC funckionise sve 5 dok program ne postane nesto vise od hello world primera, e onda ....
press any key to continue or any other to quit....
 
Odgovor na temu

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

Strane: << < .. 4 5 6 7 8 9 10 11 12 13

[ Pregleda: 69244 | Odgovora: 242 ] > FB > Twit

Postavi temu Odgovori

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