Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 337 odgovora
  • 168.631 pregleda

Najnovija ↓

Re: Kod koji daje neočekivani rezultat 05.07.2020. u 02:33 · pre 77 meseci #161
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
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 03:30 · pre 77 meseci #162
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


Re: Kod koji daje neočekivani rezultat 05.07.2020. u 06:50 · pre 77 meseci #163
Da li ti znaš šta je to remainder ili ostatak?
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 11:53 · pre 77 meseci #165
Pojam ostatka se ne definiše programskim jezicima, već teoremom o euklidskom delenju.

Neka su a ib celi brojevi takvi da je b\neq 0. Tada postoje jednoznačno određeni celi brojevi q i r takvi da važi

a=bq+r, 0\leq r<|b|.

Pritom, broj r zovemo ostatkom pri delenju broja a brojem b.

Naravno, umesto skupa \{0,\dots,|b|-1\}, moguć je i drugi izbor sistema ostataka, ali on treba da ima |b| elemenata i razlika bilo koja dva elementa tog skupa ne sme biti deljiva sa b.

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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Sviđa mi se1
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 11:55 · pre 77 meseci #166
Š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?
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 12:13 · pre 77 meseci #167
"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.
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 12:15 · pre 77 meseci #168
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.
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 12:45 · pre 77 meseci #169
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;
}
 

Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 05.07.2020. u 13:44 · pre 77 meseci #170
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 00:16 · pre 77 meseci #171
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 ;)

Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 03:31 · pre 77 meseci #172
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.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 09:13 · pre 77 meseci #173
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?
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 09:19 · pre 77 meseci #174
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.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 09:27 · pre 77 meseci #175
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 10:17 · pre 77 meseci #176
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.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 10:23 · pre 77 meseci #177
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 10:43 · pre 77 meseci #178
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++).
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 12:35 · pre 77 meseci #179
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.
Re: Kod koji daje neočekivani rezultat 06.07.2020. u 12:45 · pre 77 meseci #180
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 ....
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme