Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

zastosowanie typu int

364 views
Skip to first unread message

Kicer

unread,
Feb 8, 2009, 7:04:10 AM2/8/09
to
Witam

nurtuje mnie taka sprawa:
dlaczego tak powszechnie uzywa się typu int (bez unsigned) często w
sytuacjach gdzie jest to całkowicie nienaturalne ?

np sizeof zwaraca int, dlaczego? jak rozmiar moze byc ujemny?

spotkalem się kiedys, chyba przy sambie, ze nie moglem przeslac pliku
wiekszego niz 2GB (pewnie wlasnie przez uzycie inta).
Windows 98 smiesznie pokazywal rozmiar plików wiekszych niż 2GB (jesli
dobrze pamietam to jako ujemne).
Kolejny przykład: w sieci mamy proxy na squidzie, przy sciąganiu plików np
iso, transfer pada przy 2 GB, trzeba sie laczyc bezposrednio, czyzby znowu
int ?

jakby sie zastanowic to w 99% zastosowan liczby ujemne są wogóle
niepotrzebne.

Dlaczego więc int jest domyslnie całkowity zamiast naturalny ? jak dla mnie
jest to zmarnowanie 1 bitu.

Rozumiem ze czesto zwraca się tak błędy (jesli funkcja zwraca ujemny wynik
to znaczy ze bład), ale zeby aż 2^31 kombinacji na to marnować ?


--
Michał Walenciak, gg: 3729519, poczta: Kicer86
http://kicer.elsat.net.pl gmail.com

Mateusz Loskot

unread,
Feb 8, 2009, 7:27:33 AM2/8/09
to
Kicer pisze:

> Witam
>
> nurtuje mnie taka sprawa:
> dlaczego tak powszechnie uzywa się typu int (bez unsigned) często w
> sytuacjach gdzie jest to całkowicie nienaturalne ?
>
> np sizeof zwaraca int, dlaczego? jak rozmiar moze byc ujemny?

Według C/6.5.3.4 oraz C++/5.3.3/6 sizeof zwraca size_t,
więc zwraca unsigned integer.

Pozdrawiam
--
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org

Marcin 'Qrczak' Kowalczyk

unread,
Feb 8, 2009, 7:50:55 AM2/8/09
to
On 8 Lut, 13:04, Kicer <n...@email.here> wrote:

> np sizeof zwaraca int, dlaczego? jak rozmiar moze byc ujemny?

sizeof zwraca size_t, który może być większy niż int i jest unsigned.

Ale używanie typu unsigned tylko dlatego, że dziedzina nie zawiera
liczb ujemnych, często jest błędem. Na przykład porównanie 'i < u' dla
'i' typu int i 'u' typu unsigned da zły wynik, jeśli 'i' jest ujemne.
Wyrażenie 'i - 1' przepełnia się dopiero przy 'i' idącym w miliardy;
wyrażenie 'u - 1' przepełnia się już dla 'u' równego 0, co jest
bardziej prawdopodobne.

> spotkalem się kiedys, chyba przy sambie, ze nie moglem przeslac pliku
> wiekszego niz 2GB (pewnie wlasnie przez uzycie inta).

Raczej przez użycie typu 32-bitowego. Rozmiary plików w dzisiejszych
czasach (a nawet wczorajszych) wymagają liczb 64-bitowych. I takie są
zazwyczaj używane, ograniczenia wielkości plików do 32 bitów to jakieś
zaszłości w kiepsko zaprojektowanych protokołach.

Coraz bardziej popularne są 64-bitowe procesory, dla których 64 bity
są bardziej naturalne niż 32.

> Dlaczego więc int jest domyslnie całkowity zamiast naturalny ? jak dla mnie
> jest to zmarnowanie 1 bitu.

1 bit to prawie nic. Nie warto się o niego bić. Konsekwentne używanie
typów ze znakiem (byle wystarczająco dużych) powoduje mniej
niespodzianek.

Kicer

unread,
Feb 8, 2009, 8:05:43 AM2/8/09
to
Marcin 'Qrczak' Kowalczyk wrote:

> Ale używanie typu unsigned tylko dlatego, że dziedzina nie zawiera
> liczb ujemnych, często jest błędem. Na przykład porównanie 'i < u' dla
> 'i' typu int i 'u' typu unsigned da zły wynik, jeśli 'i' jest ujemne.
> Wyrażenie 'i - 1' przepełnia się dopiero przy 'i' idącym w miliardy;
> wyrażenie 'u - 1' przepełnia się już dla 'u' równego 0, co jest
> bardziej prawdopodobne.

nigdy nie mialem z tym problemu :)
tymbardziej ze swego czasu duzo w pascalu programowalem i ciagle byte i word
uzywalem

>
>> spotkalem się kiedys, chyba przy sambie, ze nie moglem przeslac pliku
>> wiekszego niz 2GB (pewnie wlasnie przez uzycie inta).
>
> Raczej przez użycie typu 32-bitowego. Rozmiary plików w dzisiejszych
> czasach (a nawet wczorajszych) wymagają liczb 64-bitowych. I takie są
> zazwyczaj używane, ograniczenia wielkości plików do 32 bitów to jakieś
> zaszłości w kiepsko zaprojektowanych protokołach.
>
> Coraz bardziej popularne są 64-bitowe procesory, dla których 64 bity
> są bardziej naturalne niż 32.

to racja ale w windowsie nadal brak 64 bitowych programów co jeszcze przez
pewien czas bedzie powodowac problemy jak wyzej

>> Dlaczego więc int jest domyslnie całkowity zamiast naturalny ? jak dla
>> mnie jest to zmarnowanie 1 bitu.
>
> 1 bit to prawie nic. Nie warto się o niego bić. Konsekwentne używanie
> typów ze znakiem (byle wystarczająco dużych) powoduje mniej
> niespodzianek.

swego czasu znalazłem w necie gotowy program do obliczania sumy crc32
operujący na charach.
dopóki podowalo sie mu dane textowe było ok, jak zapodalem bin to przy
pierwszej lepszej liczbe >128 funkcja sie sypała. analizując źródła bochsa
znalazłem identyczna funkcje ale juz na typie unsigned która dziala
poprawnie zawsze.
jaki był tu cel uzycia typu char? efektem jest tylko i wylacznie
ograniczenie rozmiaru danych do 7 bitów (po co?) + zmniejszenie
funkcjonalnosci

Kicer

unread,
Feb 8, 2009, 8:05:59 AM2/8/09
to
Mateusz Loskot wrote:

> Kicer pisze:
>> Witam
>>
>> nurtuje mnie taka sprawa:
>> dlaczego tak powszechnie uzywa się typu int (bez unsigned) często w
>> sytuacjach gdzie jest to całkowicie nienaturalne ?
>>
>> np sizeof zwaraca int, dlaczego? jak rozmiar moze byc ujemny?
>
> Według C/6.5.3.4 oraz C++/5.3.3/6 sizeof zwraca size_t,
> więc zwraca unsigned integer.
>

no to cos mi sie pomerdało ;)

Maciej Sobczak

unread,
Feb 8, 2009, 5:19:20 PM2/8/09
to
On 8 Lut, 13:50, "Marcin 'Qrczak' Kowalczyk" <qrc...@knm.org.pl>
wrote:

> Ale używanie typu unsigned tylko dlatego, że dziedzina nie zawiera
> liczb ujemnych, często jest błędem.

Nie jest. To jest właśnie najbardziej naturalne.

> Na przykład porównanie
[...]

Właśnie *to* jest wtedy błędem a nie samo użycie typu unsigned.
Problemem są też niejawne konwersje i promocje - ale nie sam typ
unsigned.

Problemem jest oczywiśćie też fakt, że typ unsigned pełni zbyt wiele
funkcji (np. jest typem modulo nawet/zwłaszcza wtedy, gdy modulo nie
jest potrzebne), ale nadal w sensie dziedziny jest to najbliższy
samodokumentujący się typ do wyrażania takich dziedzin jak rozmiary,
liczność czy indeksy.

--
Maciej Sobczak * www.msobczak.com * www.inspirel.com

Marcin 'Qrczak' Kowalczyk

unread,
Feb 8, 2009, 6:10:12 PM2/8/09
to
On 8 Lut, 23:19, Maciej Sobczak <see.my.homep...@gmail.com> wrote:

> Właśnie *to* jest wtedy błędem a nie samo użycie typu unsigned.
> Problemem są też niejawne konwersje i promocje - ale nie sam typ
> unsigned.

Niejawne konwersje i promocje są powodem, dla których samo używanie
typów unsigned często jest błędem. Na przykład mnożenie signed przez
unsigned ma wynik unsigned, co przepełnia się kiedy tylko wartość
signed jest ujemna; mnożenie dwóch signed przepełnia się tylko kiedy
wartości są ogromne. Przy używaniu typów ze znakiem problemów jest
mniej (poza wąskimi zastosowaniami, kiedy typy unsigned mają sens -
paczki bitów, fragmenty pamięci, pola protokołów wyspecyfikowane jako
unsigned).

Jeśli potrzebuję przechować licznik serwerów, na których odpowiedzi na
rozproszone zapytanie jeszcze czekam, to używam typu int. Użycie typu
unsigned nic tu nie da poza utrudnionym wykrywaniem błędu, gdyby z
powodu jakiegoś błędu licznik zszedł poniżej 0 (bo statycznie jest z
reguły trudno, kompilator w tym nie pomoże, natomiast dynamicznie w
typie int łatwo: assert(i >= 0); a w typie unsigned trudno).

Maciej Sobczak

unread,
Feb 9, 2009, 3:21:22 AM2/9/09
to
On 9 Lut, 00:10, "Marcin 'Qrczak' Kowalczyk" <qrc...@knm.org.pl>
wrote:

> Jeśli potrzebuję przechować licznik serwerów, na których odpowiedzi na


> rozproszone zapytanie jeszcze czekam, to używam typu int. Użycie typu
> unsigned nic tu nie da poza utrudnionym wykrywaniem błędu, gdyby z
> powodu jakiegoś błędu licznik zszedł poniżej 0 (bo statycznie jest z
> reguły trudno, kompilator w tym nie pomoże, natomiast dynamicznie w
> typie int łatwo: assert(i >= 0); a w typie unsigned trudno).

Mało przekonywujące, choć popularne.

Sprawdzanie czy indeks nie zjechał poniżej 0 to tylko część problemu -
druga część to sprawdzenie, czy nie wyjechał za wysoko.

Który z tych dwóch problemów jest powszechniejszy?
W ciągu ostatnich kilku lat wszystkie bugi związane z wyjechaniem poza
tablicę, które widziałem, dotyczyły wyjechania *za wysoko* a nie za
nisko.

assert(i >= 0) nie wykryłby *żadnego* z tych bugów.

Natomiast assert(i < array_size) wykryłby te bugi i - uwaga - działa z
unsigned, a co ciekawsze - jeszcze większa uwaga - działa nawet wtedy,
gdy unsigned indeks zjedzie komuś poniżej 0.

Czyli jeżeli indeks jest unsigned, to *jeden* assert wystarczy, żeby
wykryć bugi z obu stron tablicy (!), natomiast jeżeli indeks jest
signed, to asserty muszą być *dwa*, z których ten, który sprawdza
nieujemność wykrywa tylko te bugi, które spotyka się najrzadziej.

Twoje argumenty o problemach z konwersjami i promocjami są jak
najbardziej słuszne, ale to są argumenty przeciwko konwersjom i
promocjom a nie przeciwko typom unsigned.
Fakt, że nie możemy tego poprawić nie oznacza jeszcze, że należy psuć
sobie dziedziny używając typów, które nie wyrażają tego, co się chce
robić.
Zwłaszcza, że typ unsigned jest bezpieczniejszy, bo nie daje
fałszywego poczucia bezpieczeństwa a poprawne rozwiązanie całego
problemu jest krótsze.

Marcin 'Qrczak' Kowalczyk

unread,
Feb 9, 2009, 3:54:35 AM2/9/09
to
On 9 Lut, 09:21, Maciej Sobczak <see.my.homep...@gmail.com> wrote:

> Natomiast assert(i < array_size) wykryłby te bugi

Nie mówiłem o wyjechaniu poza tablicę, tylko o wyjechaniu poza 0. Bez
żadnej tablicy.

Niedawno grzebałem w kodzie, który liczył statystyki czasów wykonania
fragmentów programu (średnią, minimum, maksimum, odchylenie
standardowe, percentyle). Czasy były uzyskiwane przez odejmowanie
bieżącego czasu w różnych momentach. Niestety używany zegar nie zawsze
był monotoniczny, więc czasem czas wychodził troszeczkę ujemny, a że
używane były też typy bez znaku, wyniki wychodziły przekłamane
(maksimum szlag trafiał).

> Zwłaszcza, że typ unsigned jest bezpieczniejszy, bo nie daje
> fałszywego poczucia bezpieczeństwa

Weź mnie nie rozśmieszaj. Właśnie typ unsigned daje fałszywe poczucie
bezpieczeństwa, bo wcale nie zabezpiecza przed odjęciem większej
liczby od mniejszej - błąd nie jest wykrywany, tylko wynik robi się
bardzo duży zamiast ujemnego.

Mirosław Habarta

unread,
Feb 9, 2009, 4:49:33 AM2/9/09
to
Marcin 'Qrczak' Kowalczyk pisze:

> On 8 Lut, 23:19, Maciej Sobczak <see.my.homep...@gmail.com> wrote:
>
>> Właśnie *to* jest wtedy błędem a nie samo użycie typu unsigned.
>> Problemem są też niejawne konwersje i promocje - ale nie sam typ
>> unsigned.
>
> Niejawne konwersje i promocje są powodem, dla których samo używanie
> typów unsigned często jest błędem. Na przykład mnożenie signed przez
> unsigned ma wynik unsigned,

A to jest kompletnie wbrew wszelkiej intuicji. Ciekawe jak była
motywacja tak dziwacznego rozwiązania. Gdyby nie takie dziwactwa, to
faktycznie używanie unsigned do obliczeń mogłoby mieć sens.

M.H.

Marek Borowski

unread,
Feb 9, 2009, 5:10:20 AM2/9/09
to
Marcin 'Qrczak' Kowalczyk wrote:
> On 9 Lut, 09:21, Maciej Sobczak <see.my.homep...@gmail.com> wrote:
>
>
>> Zwłaszcza, że typ unsigned jest bezpieczniejszy, bo nie daje
>> fałszywego poczucia bezpieczeństwa
>
> Weź mnie nie rozśmieszaj. Właśnie typ unsigned daje fałszywe poczucie
> bezpieczeństwa,

Jasne. Zwlacza kiedy odwolujemny sie do mlodszego i starszego bajtu....


Polecam

Marek

Paweł Kierski

unread,
Feb 9, 2009, 5:24:29 AM2/9/09
to

Są jeszcze różnice indeksów - signed daje dodatkowo "zwrot" różnicy,
co często się przydaje (np. naturalny sposób podawania offsetu w pliku
względem bieżącego miejsca).

--
Paweł Kierski
ne...@pkierski.net

Kicer

unread,
Feb 9, 2009, 7:00:32 AM2/9/09
to
Marcin 'Qrczak' Kowalczyk wrote:

> Weź mnie nie rozśmieszaj. Właśnie typ unsigned daje fałszywe poczucie
> bezpieczeństwa, bo wcale nie zabezpiecza przed odjęciem większej
> liczby od mniejszej - błąd nie jest wykrywany, tylko wynik robi się
> bardzo duży zamiast ujemnego.

z mojego punktu widzenia (duzo w asmie kodzie) rozróżnienie liczby ujemnej
od b. duzej polega na wykonaniu tej samej operacji ;)

pozatym jesli wyswietle czas trwania jakiejś operacji jako ujemny to jest to
taka sama bzdura jak wyswietlenie czasu b. duzego ;)

aviateur polonais

unread,
Feb 9, 2009, 8:04:45 AM2/9/09
to
Fakt jest to troche dziwne - i moge nawet powiedzieć że niepokoi mnie
w kontekscie slabosci mojej glowy bo ja wolalbym sam z siebie uzywac zgodnie z
tym co mowisz unsigned, ale 'tradycja' w c jest taka ze uzywa się int
i okazuje sie ze to dobrze działa (i jest o dziwo chyba lepsze niz
uzywanie unsigned( (w sumie nie wiem jak wyewoluowala ta tradycja
ale takie rzeczy mnie zawsze dziwią w c (c jest mądrzejsze niz ja!)

W praktyce gdy programujesz zwykle nie potrzebujesz 'bajtu' 'słowa'
'dwusłowa' (czy 'qworda' itd) tylko liczny z okreslonego zakresu
np od 1..100 czy od 0..455; naprawde wiekszość liczb jakie porzebujesz
to te c'owe 'i' (jakis indeks) i tutaj wysmienicie sprawdza się (niejako
abstrakcujny) int - nie musisz zawracac sobie glowy niczym pozatym
zapewnieniem samego siebie ze sie w tym incie zmiescisz - dla mnie
zakresy indeksow jakie potrzebuje swykle są mniejsze niz 10000 (a jesli
nie i potrzebujesz czegos wiekszego to bierzesz longa ale analogicznie -
nie siegajac do tego gornego zakresu) - tak jest najczęsciej.

(Nie wiedzialem nawiasem mowiac ze porownanie 'i' i 'u' moze sie
sypać, albo ze mnozenie int razy unsigned daje ponoc unsigned.

Dla mnie (jak wlasnie wczoraj sie zastanawialem bo siegnalem
po ksiazke od fizyki) - nawiasem mowiac, taka dygresja -
fakt z matematyki ze pomnozenie dwu liczb ujemnych daje
liczbe dodatnia wcale nie jest takie jasne, brak pieciu jablek razy
piec daje barak dwudziestu pieciu jabłek ok - ale brak pieciu
jablek razy minus piec daje dodatnie dwadziescia piec jablek ?
-5 * -5 = 25 ??)

aviateur

>
> --
> Michał Walenciak,   gg: 3729519,  poczta: Kicer86
> http://kicer.elsat.net.pl                 gmail.com


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Maciej Sobczak

unread,
Feb 9, 2009, 11:27:13 AM2/9/09
to
On 9 Lut, 09:54, "Marcin 'Qrczak' Kowalczyk" <qrc...@knm.org.pl>
wrote:

> > Natomiast assert(i < array_size) wykryłby te bugi
>
> Nie mówiłem o wyjechaniu poza tablicę, tylko o wyjechaniu poza 0. Bez
> żadnej tablicy.

Ten sam problem.

> Niedawno grzebałem w kodzie, który liczył statystyki czasów wykonania
> fragmentów programu (średnią, minimum, maksimum, odchylenie
> standardowe, percentyle). Czasy były uzyskiwane przez odejmowanie
> bieżącego czasu w różnych momentach. Niestety używany zegar nie zawsze
> był monotoniczny, więc czasem czas wychodził troszeczkę ujemny, a że
> używane były też typy bez znaku, wyniki wychodziły przekłamane
> (maksimum szlag trafiał).

Wolałbyś, żeby był ujemny? Lepiej byś się z nim czuł?
Tzn. wolałbyś w ogóle nie zauważyć tego problemu?

> Weź mnie nie rozśmieszaj. Właśnie typ unsigned daje fałszywe poczucie
> bezpieczeństwa, bo wcale nie zabezpiecza przed odjęciem większej
> liczby od mniejszej - błąd nie jest wykrywany, tylko wynik robi się
> bardzo duży zamiast ujemnego.

Wolałbyś ujemny? Lepiej byś się z nim czuł?

Nie widzę w jaki sposób ujemna wartość miałaby być lepsza od
absurdalnie dużej.

Jeżeli w Twojej dziedzinie (mówię tu np. o pop...nym zegarze, który
nie jest monotoniczny) zdarza się mieć odwrócone wielkości, to może
warto to sprawdzić przed wykonaniem odejmowania?

if (t2 >= t1)
{
duration = t2 - t1;
// log duration, compute stats, etc.
}
else
{
// clock problem
}

Wolisz najpierw odjąć a potem sprawdzić?

To jest wybór między proaktywnym testem dziedziny a sprawdzeniem post-
factum, czy się nie popieprzył wynik. Ja wolę to pierwsze, bo
precyzyjniej wskazuje problem w programie.

Maciej Piechotka

unread,
Feb 9, 2009, 12:38:26 PM2/9/09
to
> Dla mnie (jak wlasnie wczoraj sie zastanawialem bo siegnalem
> po ksiazke od fizyki) - nawiasem mowiac, taka dygresja -
> fakt z matematyki ze pomnozenie dwu liczb ujemnych daje
> liczbe dodatnia wcale nie jest takie jasne, brak pieciu jablek razy
> piec daje barak dwudziestu pieciu jabłek ok - ale brak pieciu
> jablek razy minus piec daje dodatnie dwadziescia piec jablek ?
> -5 * -5 = 25 ??)
>
> aviateur
>
>

Z aksjomatów ciała chyba (jest trochę skrótów ale chyba będzie wiadomo o
co chodzi):

(-x)(-x) = (x - 2x)(x - 2x) =
= x(x - 2x) - 2x(x - 2x) =
= xx - 2xx - 2xx + 4xx =
= xx

Pozdrawiam
--
I've probably left my head... somewhere. Please wait untill I find it.
Homepage (pl_PL): http://uzytkownik.jogger.pl/
(GNU/)Linux User: #425935 (see http://counter.li.org/)

breakstone

unread,
Feb 10, 2009, 6:28:07 AM2/10/09
to
>
> Nie widzę w jaki sposób ujemna wartość miałaby być lepsza od
> absurdalnie dużej.
>

IMO jesli ktos potrzebuje uzywac zakresu ktory miesci sie zarowno
w int jak i w unsigned to moze uzywac zarowno int jak i unsigned
W tym zakresie dzialaja one w zasadzie tak samo. Nie ma wiec technicznej
różnicy. int kontra unsigned remis 1:1. Ja osobiscie nie omawialbym chyba
przypadkow ktore wychodzą 'poza zalozenia' bo to nie jest normalne
uwazam dyskutowac przypadki ktore wychodzą poza zalozenia.
Zalozenie jest takie: liczba miesci sie w zakresie wspolnym dla int
i unsigned -> wiec uzywanie zarowno int jak i unsigned jest ok.
(Rożnice sa stylistyczne ja osobiscie uzywam zgodnie z tradycja raczej
inta ale nie jest to technicznie lepsze niz unsigned a i stylistycznie
trudno tak naprawde mi powiedziec)

Oprogramowywanie 'losowych' przypadkow (spoza zalozen) nie jest normalne.
Jesli np piszesz funkcje (np dodaj albo jakas inna) ktora normalnie dziala
na dwu liczbach 0..100 i z natury rzeczy mozesz ja napisac ogolniej
dla intow albo unsigned - to wybor ten bylby jakby 'losowy'

Z tego co rozumiem obgadujesie kwestie 'losowego, (statystycznego?)
oprogramowywania błedow' - to jest dziwna rzecz. Sam tworzysz (albo znasz)
swoje zalozenia wiez mozesz zapewnic ze beda poprawne i tyle.

pzdr
kenobi (breakstone)

Seweryn Habdank-Wojewódzki

unread,
Feb 10, 2009, 7:31:08 AM2/10/09
to
Witam,

> jakby sie zastanowic to w 99% zastosowan liczby ujemne są wogóle
> niepotrzebne.

Tak. Masz racje, ale ...

Tam gdzie chcesz miec duze liczby uzyj int64_t lub wiecej.
A najlepiej w calym kodzie miec typedef lub klase ktora nazywa sie
My_type_size i przy zmianie potrzeb i konwencji zmieniajac tylko
wnetrznosci
zmieniasz kod.

A teraz przyklad, kiedy nie dowiesz sie o problemach:

Image<unsigned char> img; // klasa obrazu zawierajacego pixele jako
unsigned char
unsigned char const bias = 200;
// for each
{
img[i,j] += bias;
}

Co sie stanie dla pixeli powyzej 55?

Dostaniesz jak najbardziej poprawne wartosci obrazu!
Jesli one beda ujemne, to zorientujesz sie ze soft jest do bani.
Natomiast jesli one beda unsigned to dostaniesz wlasnym kijem po
rekach.

Czyli moj coding standard mowi. Nie uzywac unsigned w ogole.
Natomiast wyjatek stanowia: typy size_type z STL i systuacje kiedy
unsigned jest wewnetrzu specjalnej dedykowanej klasy, ale arytmetyka
jest scisle pilnowana przez klase, czyli bez kontroli user nie moze
przekrecic
unsigned.

Pozdrawiam,

--
|\/\/| Seweryn Habdank-Wojewodzki
\/\/
Professionalism in programming - www.accu.org

Marcin 'Qrczak' Kowalczyk

unread,
Feb 10, 2009, 8:47:48 AM2/10/09
to
On 9 Lut, 17:27, Maciej Sobczak <see.my.homep...@gmail.com> wrote:

> Tzn. wolałbyś w ogóle nie zauważyć tego problemu?

Wolę zauważyć w ten sposób, że minimum wychodzi -1 zamiast 0, niż w
ten sposób, że maksimum wychodzi 4 milardy, gubiąc informację o
prawdziwym maksimum.

> Nie widzę w jaki sposób ujemna wartość miałaby być lepsza od
> absurdalnie dużej.

Powoduje mniejsze przekłamania statystyk, bo jest bliższa prawdziwej
wartości.

> Jeżeli w Twojej dziedzinie (mówię tu np. o pop...nym zegarze, który
> nie jest monotoniczny) zdarza się mieć odwrócone wielkości, to może
> warto to sprawdzić przed wykonaniem odejmowania?

Nie ma po co, jeśli używane są typy ze znakiem. Statystycznie jest
tyle samo błędów na plus i na minus, a że niektóre błędy małej
wartości na minus przeskakują przez zero - nie szkodzi.

aviateur

unread,
Feb 10, 2009, 9:06:57 AM2/10/09
to
> Z aksjomatow ciala chyba (jest troche skrotow ale chyba bedzie wiadomo o
> co chodzi):

> (-x)(-x) = (x - 2x)(x - 2x) =
> = x(x - 2x) - 2x(x - 2x) =
> = xx - 2xx - 2xx + 4xx =
> = xx

No nie bardzo - do '4xx' wszystko jest ok
(wszystkie operacje na jabłkach są ok);
ale samo to 4xx jest tu napisane jak byk
w miejsce (-2x)(-2x)
Gdzie tu są aksjomaty ciała? Nawet jak jakis
aksjomat cialarobi z drugiej linijki trzecią
to (jesli tak jest) i tak trzeba by sie zagłębić w
te zaleznosci miedzy ciałem a faktem ze niby (-1)(-1)=1
by cos dostrzec, ale samo to i tak nie
tłumaczy tego faktu. (-1)*(-1) to wydaje sie
na zdrowy rozum raczej --1 a nie 1

Gogiel

unread,
Feb 10, 2009, 9:30:16 AM2/10/09
to

Negacja negacji, to zdanie prawdziwe przeciez. A jesli chodzi o jablka to
nie liczy sie w ten sposob. Bo jablko razy jablko, daje jednostke
jablko^2.

Michoo

unread,
Feb 10, 2009, 11:35:36 AM2/10/09
to
Marcin 'Qrczak' Kowalczyk pisze:

> On 9 Lut, 17:27, Maciej Sobczak <see.my.homep...@gmail.com> wrote:
>
>> Tzn. wolałbyś w ogóle nie zauważyć tego problemu?
>
> Wolę zauważyć w ten sposób, że minimum wychodzi -1 zamiast 0, niż w
> ten sposób, że maksimum wychodzi 4 milardy, gubiąc informację o
> prawdziwym maksimum.
Wiesz, jeżeli masz program który popełnia tego typu błędy to lepiej żeby
wyszło 4 miliardy i program wybuchł zanim zdąży narobić szkody. Taki
program jest po prostu błędny.

>
>> Nie widzę w jaki sposób ujemna wartość miałaby być lepsza od
>> absurdalnie dużej.
>
> Powoduje mniejsze przekłamania statystyk, bo jest bliższa prawdziwej
> wartości.
Ale to jest argument PRZECIW - jeżeli błędy są małe to trudno je
zauważyć i mogą powodować powstanie bardzo dużego skumulowanego błędu.
(Jak np operacje na float, które (podobno) w efekcie powodowały wadliwe
działanie wyrzutni patriot.) Jeżeli błąd jest absurdalny to taką wartość
możemy bezpiecznie odrzucić i podać informację o tym, że program nie działa.


--
Pozdrawiam
Michoo

Marcin 'Qrczak' Kowalczyk

unread,
Feb 10, 2009, 12:37:19 PM2/10/09
to
On 10 Lut, 17:35, Michoo <michoo_n...@vp.pl> wrote:

> Ale to jest argument PRZECIW - jeżeli błędy są małe to trudno je
> zauważyć i mogą powodować powstanie bardzo dużego skumulowanego błędu.

Tutaj nie ma dużego skumulowanego błędu. Niedokładności zegara
statystyczne się wyrównują.

Michoo

unread,
Feb 10, 2009, 2:54:50 PM2/10/09
to
Marcin 'Qrczak' Kowalczyk pisze:
W tej sytuacji działa - ok. A co się stanie jak zrobisz taki sam
program, ale zegarek usera będzie niedokładny i raz na dobę będzie via
NTP przesuwany o -10sec? Po tygodniu to minuta w plecy - tylko czy aż?


Tak z ciekawości - co to był za zegar?

--
Pozdrawiam
Michoo

Maciej Piechotka

unread,
Feb 10, 2009, 3:12:01 PM2/10/09
to
"aviateur" <profesor...@poczta.onet.pl> writes:

-(-1) to z definicji - odwrotność -1. Odwrotności mogą być tylko jedne:

Założenie: a' + a = a + a' = 0 = a + a'' = a'' + a

a + a' = 0
a'' + a + a' = a'' + 0 = a'' (z definicji elementu 0)
Z łączności:
(a'' + a) + a' = a''
Z definicji elementu odwrotnego:
0 + a' = a''
Ponownie z definicji elemntu neutralnego
a' = a''

Więc odwrotność odwrotności jest odwrotnością (co chyba jest prawdą dla
każdej grupy ;) ).

A więc -(-1) to odwrotność -1. Jedną z odwrotności -1 jest 1 (bo 1 +
(-1) = (-1) + 1 = 0). A z powyższego dowodu istnieje tylko jeden element
przeciwny do każdego elementu (*co* *czyni* *w* *ogóle* *zapis* *-1*
*dobrze* *zdefiniowanym*). A więc -(-1) = 1 dla grupy - w szczególności
ciała.

Marcin 'Qrczak' Kowalczyk

unread,
Feb 10, 2009, 6:45:21 PM2/10/09
to
On 10 Lut, 20:54, Michoo <michoo_n...@vp.pl> wrote:

> W tej sytuacji działa - ok. A co się stanie jak zrobisz taki sam
> program, ale zegarek usera będzie niedokładny i raz na dobę będzie via
> NTP przesuwany o -10sec? Po tygodniu to minuta w plecy - tylko czy aż?

Przez całą dobę każdy pomiar jest trochę dłuższy, raz na dobę najwyżej
jeden pomiar jest dużo krótszy (być może ujemny). W okresie wielu dni
suma czasów (czyli średnia) się wyrównuje. Oczywiście tak duże
nierówności mogłyby już przeszkadzać.

> Tak z ciekawości - co to był za zegar?

Zdaje się, że liczy czas z cykli procesora, co jakiś czas
synchronizując się z zegarem systemowym. Czyli analogiczna sytuacja,
ale w dużo mniejszej skali. W tej skali i przy tym zastosowaniu to nie
przeszkadza.

Kicer

unread,
Feb 11, 2009, 2:07:49 AM2/11/09
to
Seweryn Habdank-Wojewódzki wrote:

> Witam,
>
>> jakby sie zastanowic to w 99% zastosowan liczby ujemne są wogóle
>> niepotrzebne.
>
> Tak. Masz racje, ale ...
>
> Tam gdzie chcesz miec duze liczby uzyj int64_t lub wiecej.
> A najlepiej w calym kodzie miec typedef lub klase ktora nazywa sie
> My_type_size i przy zmianie potrzeb i konwencji zmieniajac tylko
> wnetrznosci
> zmieniasz kod.
>
> A teraz przyklad, kiedy nie dowiesz sie o problemach:
>
> Image<unsigned char> img; // klasa obrazu zawierajacego pixele jako
> unsigned char
> unsigned char const bias = 200;
> // for each
> {
> img[i,j] += bias;
> }
>
> Co sie stanie dla pixeli powyzej 55?
>
> Dostaniesz jak najbardziej poprawne wartosci obrazu!
> Jesli one beda ujemne, to zorientujesz sie ze soft jest do bani.
> Natomiast jesli one beda unsigned to dostaniesz wlasnym kijem po
> rekach.

czyli rozumiem chcesz zamiast 8 bitowej paleti kolorów miec 7 bitową ?:>

ja nawet mialem taki przypadek na studiach, programowanie z pascala.
trzeba było cos policzyc i ja wszystko robilem na wordach i nie mialem
problemów zadnych. koledzy natomiast jechali po integerach i programy im sie
sypaly równo ;) okazalo sie ze wynik ktorejs z kolejnych operacji
matematycznych wychodzil poza 2^15 i mimo ze byli to inteligentni ludzie
(mowie calowicie powazne :) ) to nie potrafili znaleźć błedu (ztcp ujemny
znak integera gdzies sie tracił po drodze).
a ja po prostu wiedzialem i byłem pewny ze obliczenia które będą zachodzic w
programie nigdy nie beda miały ujemnego wyniku. Do dziś trzymie się tej
zasady: jesli cos nie moze byc ujemne (indexy tablic, rozmiary, sumy
czegokolwiek dodatniego) to po prostu uzywam swojego typu unsigned i _nigdy_
nie miałem z tym żadnego problemu.

Kicer

unread,
Feb 11, 2009, 2:12:25 AM2/11/09
to
Marcin 'Qrczak' Kowalczyk wrote:

> On 9 Lut, 09:21, Maciej Sobczak <see.my.homep...@gmail.com> wrote:
>
>> Natomiast assert(i < array_size) wykryłby te bugi
>
> Nie mówiłem o wyjechaniu poza tablicę, tylko o wyjechaniu poza 0. Bez
> żadnej tablicy.
>
> Niedawno grzebałem w kodzie, który liczył statystyki czasów wykonania
> fragmentów programu (średnią, minimum, maksimum, odchylenie
> standardowe, percentyle). Czasy były uzyskiwane przez odejmowanie
> bieżącego czasu w różnych momentach. Niestety używany zegar nie zawsze
> był monotoniczny, więc czasem czas wychodził troszeczkę ujemny, a że
> używane były też typy bez znaku, wyniki wychodziły przekłamane
> (maksimum szlag trafiał).

no ok, tu masz rację - wynik może być ujemy: używasz signed, tylko trzeba o
tym wiedzieć :), gdyby jednak zegar był monotoniczny no to po co CI znak ?:>

generalnie nie mowie, zeby nie uzywac signed, ale żeby robić to z głową (np
nie wiem gdzie ją mial ten co pisał windows98 robiąc wspomniane już
wyswietlanie rozmiaru pliku jako liczbe ze znakiem, to juz lepiej by floata
uzył ;P)

Zbigniew Zagórski

unread,
Feb 11, 2009, 2:49:44 AM2/11/09
to
On 10 Lut, 13:31, Seweryn Habdank-Wojewódzki <habd...@gmail.com>
wrote:

> A teraz przyklad, kiedy nie dowiesz sie o problemach:

Zły przykład ...

> Image<unsigned char> img; // klasa obrazu zawierajacego pixele jako
> unsigned char
> unsigned char const bias = 200;
> // for each
> {
>    img[i,j] += bias;
>
> }
>
> Co sie stanie dla pixeli powyzej 55?

A jak zrobisz bias=200 na signed char ?

> Dostaniesz jak najbardziej poprawne wartosci obrazu!
> Jesli one beda ujemne, to zorientujesz sie ze soft jest do bani.
> Natomiast jesli one beda unsigned to dostaniesz wlasnym kijem po
> rekach.

Ale to jest problem który się rozwiązuje tak jak napisał Maciek.
Trzeba sprawdzić przed obliczeniem czy nastąpi warunek
brzegowy/overflow i odpowiednio zaadaptować wynik:

if( add_will_overflow<unsigned char>(img[i+j], bias) ) {
img[i,j] = MAX;
} else {
img[i,j] += bias;
}

albo

img[i,j] = add_with_bounds<unsigned char>(img[i+j], bias, 0, MAX)

bo pierwsze nie pokrywa odejmowania.

Wróżenie z fusów post-factum jest złe w każdej arytmetyce modulo
z którą mamy do czynienia.

Już nie mówiąc o tym, że kto to widział 7-bitowy piksel.

ZZ

Maciej Sobczak

unread,
Feb 11, 2009, 3:49:00 AM2/11/09
to
On 10 Lut, 14:47, "Marcin 'Qrczak' Kowalczyk" <qrc...@knm.org.pl>
wrote:

> > Tzn. wolałbyś w ogóle nie zauważyć tego problemu?
>
> Wolę zauważyć w ten sposób, że minimum wychodzi -1 zamiast 0, niż w
> ten sposób, że maksimum wychodzi 4 milardy, gubiąc informację o
> prawdziwym maksimum.

Wolisz zgubić informację o prawdziwym minimum, niż o prawdziwym
maksimum? :-D
Ja wolę w ogóle nie gubić.

> > Nie widzę w jaki sposób ujemna wartość miałaby być lepsza od
> > absurdalnie dużej.
>
> Powoduje mniejsze przekłamania statystyk, bo jest bliższa prawdziwej
> wartości.

Programowanie probabilistyczne? Bardzo ciekawy temat, w dodatku z
przyszłością - podobno można w ten sposób zaoszczędzić energię w
urządzeniach przenośnych. Obniżamy napięcie i olewamy przekłamania w
niektórych obliczeniach - półgłuchy użytkownik iPoda i tak się nie
zorientuje.

> Statystycznie jest
> tyle samo błędów na plus i na minus, a że niektóre błędy małej
> wartości na minus przeskakują przez zero - nie szkodzi.

Wszystko się zgadza - bardzo rozsądnie uzasadniłeś użycie typu int w
jednym konkretnym zastosowaniu, któro ze względu na swoją specyfikę
jest jednym pikselem w całym obrazku.
Ale żeby zaraz uogólniać?

Ja mam tablice i indeksy. Mam używać typu int, bo jak czasem wyjadę za
nisko a czasem za wysoko to statystycznie będzie dobrze?

Seweryn Habdank-Wojewódzki

unread,
Feb 11, 2009, 4:56:27 AM2/11/09
to
Witam,

> czyli rozumiem chcesz zamiast 8 bitowej paleti kolorów miec 7 bitową ?:>

Nie. Nie kapujesz o co chodzi. Chodzi o udostepnianie arytmetyki dla
typu
unsigned. User nie ma prawa grzebac przy takich wartosciach, bez
kontroli.

Polecam zabawe generatorem kodu:
http://www.msobczak.com/prog/typegen/

Moge miec unsigned jako skladowa prywatna. Moge nawet dla obrazow
(jako wyjatek ze wzgledu na standardy swiatowe) miec zwrocona wartosc
unsigned const. Ale nie pozwalam userowi pracowac na tym typie
w sensie arytmetyki. Nie ma bata w zadnych logach nie dostane
informacji
co jest grane. Natomiast np. uzywajac typegen tworzac klase z
odpowiednia
arytmetyka i semantyka rzucania bledow moge jako kontenera na dane
uzywac
unsigned. Unsigned jest dla mnie TYLKO kontenerem na dane, ktorych
zakres akurat sie zgadza. Obliczen nie wykonuje na nich w wersji raw-
unsigned.

> sypaly równo ;) okazalo sie ze wynik ktorejs z kolejnych operacji
> matematycznych wychodzil poza 2^15 i mimo ze byli to inteligentni ludzie
> (mowie calowicie powazne :) ) to nie potrafili znaleźć błedu (ztcp ujemny
> znak integera gdzies sie tracił po drodze).

Jak znak integera traci sie gdzies po drodze, to znaczy, ze to nie
jest wina integera
a tego, co mu znak zabiera.

> a ja po prostu wiedzialem i byłem pewny ze obliczenia które będą zachodzic w
> programie nigdy nie beda miały ujemnego wyniku. Do dziś trzymie się tej
> zasady: jesli cos nie moze byc ujemne (indexy tablic, rozmiary, sumy
> czegokolwiek dodatniego) to po prostu uzywam swojego typu unsigned i _nigdy_
> nie miałem z tym żadnego problemu.

Ja tez, ale za duzo bledow programistow widzialem i ciagle widuje.

Jeszcze raz podkreslam. Jesli masz klase, ktora zawiera unsigned i
dostarcza
stosownej arytmetyki i obslugi bledow, to dobrze.

Poki co dla unsigned widze kilka rodzajow rozwiazania problemow.

1. Saturacja. Czyli wynik, ktory moze dac <0 daje zero. jesli wynik
>max daje max.
2. Kod bledu, Wyjatek lub assert oraz wartosc jest niezmieniona.
3. Kod bledu, Wyjatek lub assert oraz wartosc jest max lub min w
zaleznosci od dzialania
arytmetycznego.

miażdżyciel kamieni nerkowych

unread,
Feb 11, 2009, 6:08:03 AM2/11/09
to

robicie z programowania i kompow maszyny analogowe? wyjechany pomysł

miażdżyciel kamieni nerkowych

miażdżyciel kamieni nerkowych

unread,
Feb 11, 2009, 6:22:25 AM2/11/09
to

float jest cholernie niedokladny - tylko 23 bity dokladnosci (za wiki) a int
ma przynajmniej 31; Jesli uzywa sie zwykle liczby ktora miesci sie zarowno w
int jak i unsigned (czyli dodatniej) np z zakresu 1..10000 (czy 0..9999) to
sugeruje niejako ze moga wystapic przypadki ze bedzie sie potrzebowac po
prostu wiecej, wiekszego zakresu wiec jesliby juz przyjac taką metode
rozumowania wieksze szanse dawaloby uzycie unsigned; nagle zapotrzebowanie na
minusy gdy uzywales plusow to niejaka zmana jakości nie tylko ilosci :-/
ale oczywiscie trafiaja sie oba przypadki :-/

miażdżyciel kamieni nerkowych
--
'Dacie wiarę że za czasów naszych słowiańskich praprzodków bałtyk był
słodkowodnym jeziorem, można było pić wodę z jeziora bałtyku; to musiały
być czasy!'


>
> --
> Michał Walenciak,   gg: 3729519,  poczta: Kicer86
> http://kicer.elsat.net.pl                 gmail.com
>

miażdżyciel

unread,
Feb 11, 2009, 6:32:45 AM2/11/09
to

ja używam intów i też nigdy albo nieomal nigdy nie miałem żadnego problemu,
takie błedy się rzadko zdarzają, błedy runtime dosyć rzadko sie zdarzają
(przynajmniej w moim klepaniu w c), jedyne jakie pamietam mi sie swego czasu
zdarzały to mieszanie typow liczbowych (mnozenie, dodwanie, odejmowanie,
dzielenie wzajem intow i doubli, co mnie nauczyło ze trzeba dla pewnosci
dodawac duzo rzutowan na spodziewane typy)


>
>
>
> --
> Michał Walenciak,   gg: 3729519,  poczta: Kicer86
> http://kicer.elsat.net.pl                 gmail.com
>

si...@poczta.onet.pl

unread,
Feb 11, 2009, 6:51:07 AM2/11/09
to
> Dnia Tue, 10 Feb 2009 15:06:57 +0100, aviateur napisaĹ (a):

> Negacja negacji, to zdanie prawdziwe przeciez. A jesli chodzi o jablka to
> nie liczy sie w ten sposob. Bo jablko razy jablko, daje jednostke
> jablko^2.

O Matko! Co za bzdury tu wypisujecie?

"Jeśli chodzi o jabłka...", to nie liczy się jabłka, ale ich ilość - NIE MA
takiej jednostki jak "jabłko" - i jeśli już chcemy mnożyć "owoce", czy ich brak,
to do takiego liczenia stosuje się jednostkę o nazwie "sztuka". Zatem zadanie z
jabłkami powinno być zapisane tak:

-5 [sztuk] * 5 = -25 [sztuk]
-5 [sztuk] * -5 = 25 [sztuk]

Co na chłopski rozum można tak tłumaczyć: jeśli za każdym razem ubywa man 5, to
po pięciu takich przypadkach ubędzie nam 25 jabłek (5* -5 = -25), ale jeśli
zmniejszymy liczbę takich przypadków o 5, to uzyskamy straty mniejsze o 25
sztuk. Co nie oznacza, że 25 jabłek nam przybędzie, tylko, że końcowy bilans
wzrośnie nam o 25 sztuk.

strata = 5 (ilość strat) * -5 sztuk (wielkość straty) = -25 sztuk, ale
zysk = -5 (ilość strat) * -5 sztuk (wielkośc straty) = 25 sztuk.

I nie ma tu zastosowanie żadna logika tylko zwykła matematyka, która wyraźnie
mówi, że -5 * -5 = 25.

Jeśli ktoś jednak chce mnożyć jabłka, to niech zasadzi jabłonkę.

Kicer

unread,
Feb 11, 2009, 7:28:56 AM2/11/09
to
mia?d?yciel kamieni nerkowych wrote:

> float jest cholernie niedokladny - tylko 23 bity dokladnosci (za wiki) a
> int ma przynajmniej 31; Jesli uzywa sie zwykle liczby ktora miesci sie
> zarowno w int jak i unsigned (czyli dodatniej) np z zakresu 1..10000 (czy
> 0..9999) to sugeruje niejako ze  moga wystapic przypadki ze bedzie sie
> potrzebowac po prostu wiecej,  wiekszego zakresu wiec jesliby juz przyjac
> taką metode rozumowania wieksze szanse dawaloby uzycie unsigned; nagle
> zapotrzebowanie na minusy gdy uzywales plusow to niejaka zmana jakości nie
> tylko ilosci :-/ ale oczywiscie trafiaja sie oba przypadki :-/

wole znać rozmiar pliku z +- dokladnością niż zostać poinformowanym ze jego
rozmiar to -1 bajt ;)

Kicer

unread,
Feb 11, 2009, 7:29:21 AM2/11/09
to
mia?d?yciel kamieni nerkowych wrote:

> float jest cholernie niedokladny - tylko 23 bity dokladnosci (za wiki) a
> int ma przynajmniej 31; Jesli uzywa sie zwykle liczby ktora miesci sie
> zarowno w int jak i unsigned (czyli dodatniej) np z zakresu 1..10000 (czy
> 0..9999) to sugeruje niejako ze  moga wystapic przypadki ze bedzie sie
> potrzebowac po prostu wiecej,  wiekszego zakresu wiec jesliby juz przyjac
> taką metode rozumowania wieksze szanse dawaloby uzycie unsigned; nagle
> zapotrzebowanie na minusy gdy uzywales plusow to niejaka zmana jakości nie
> tylko ilosci :-/ ale oczywiscie trafiaja sie oba przypadki :-/

wole znać rozmiar pliku z +- dokladnością niż zostać poinformowanym ze jego

rozmiar to -1 bajt ;)

--

Kicer

unread,
Feb 11, 2009, 7:29:46 AM2/11/09
to
Seweryn Habdank-Wojewódzki wrote:

>> sypaly równo ;) okazalo sie ze wynik ktorejs z kolejnych operacji
>> matematycznych wychodzil poza 2^15 i mimo ze byli to inteligentni ludzie
>> (mowie calowicie powazne :) ) to nie potrafili znaleźć błedu (ztcp ujemny
>> znak integera gdzies sie tracił po drodze).
>
> Jak znak integera traci sie gdzies po drodze, to znaczy, ze to nie
> jest wina integera
> a tego, co mu znak zabiera.

nie pamietam juz jak to było ale moze zwykle podnoszenie do kwadratu?

>
>> a ja po prostu wiedzialem i byłem pewny ze obliczenia które będą
>> zachodzic w programie nigdy nie beda miały ujemnego wyniku. Do dziś
>> trzymie się tej zasady: jesli cos nie moze byc ujemne (indexy tablic,
>> rozmiary, sumy czegokolwiek dodatniego) to po prostu uzywam swojego typu
>> unsigned i _nigdy_ nie miałem z tym żadnego problemu.
>
> Ja tez, ale za duzo bledow programistow widzialem i ciagle widuje.
>
> Jeszcze raz podkreslam. Jesli masz klase, ktora zawiera unsigned i
> dostarcza
> stosownej arytmetyki i obslugi bledow, to dobrze.
>
> Poki co dla unsigned widze kilka rodzajow rozwiazania problemow.
>
> 1. Saturacja. Czyli wynik, ktory moze dac <0 daje zero. jesli wynik
>>max daje max.
> 2. Kod bledu, Wyjatek lub assert oraz wartosc jest niezmieniona.
> 3. Kod bledu, Wyjatek lub assert oraz wartosc jest max lub min w
> zaleznosci od dzialania
> arytmetycznego.

ja z kolei nie widze innego zastosowania dla signed jak operacje
matematyczne (stricte matematyczne , nie sumowanie rozmiarów jakichś
struktur czy "przemiatanie" tablic)
ew jakies zwracanie błędów w sytuacjach gdzie zwracamy inta mając pewność ze
nigdy nie bedzie on wiekszy od 2GB.
reszta dla mnie jest całkowicie nieuzasadnionym wepchnieciem znaku tam gdzie
jest on tylko pasożytem na wolnym ramie ;) (jakby nie było 1 bit a 2GB
różnicy (czy 32 bitowym incie)).

profesor...@poczta.onet.pl

unread,
Feb 11, 2009, 7:38:20 AM2/11/09
to
> mia?d?yciel kamieni nerkowych wrote:
>
> > float jest cholernie niedokladny - tylko 23 bity dokladnosci (za wiki) a
> > int ma przynajmniej 31; Jesli uzywa sie zwykle liczby ktora miesci sie
> > zarowno w int jak i unsigned (czyli dodatniej) np z zakresu 1..10000 (czy
> > 0..9999) to sugeruje niejako ze  moga wystapic przypadki ze bedzie sie
> > potrzebowac po prostu wiecej,  wiekszego zakresu wiec jesliby juz przyjac
> > taką metode rozumowania wieksze szanse dawaloby uzycie unsigned; nagle
> > zapotrzebowanie na minusy gdy uzywales plusow to niejaka zmana jakości nie
> > tylko ilosci :-/ ale oczywiscie trafiaja sie oba przypadki :-/
>
> wole znać rozmiar pliku z +- dokladnością niż zostać poinformowanym ze jego
> rozmiar to -1 bajt ;)
>
No w sumie tak

--
There's nothing sexier than a woman who rocks :
http://www.youtube.com/watch?v=MIWruBo9RcA

Kicer

unread,
Feb 11, 2009, 7:40:59 AM2/11/09
to
Kicer wrote:

^^^^^^^^^^^^^^^^^^^^^^^^^^^^
czy -> przy ;)

Seweryn Habdank-Wojewódzki

unread,
Feb 11, 2009, 11:20:16 AM2/11/09
to
Witam,

> nie pamietam juz jak to było ale moze zwykle podnoszenie do kwadratu?

kwadrat to jest w ogole paskudna operacja, bo domyslnie wymaga
podwojnego
zakresu bitowego, na uC sa takie operacje mnozenia, ze wynik mozenia
laduje
w rejestrze, ktory ma wiekszy zakres bitowy, a potem nastepuje proba
zrzucenia
wyniku na zakres podstawowy i najwyzej konczy sie to bledem nadmiaru.

> ja z kolei nie widze innego zastosowania dla signed jak operacje
> matematyczne (stricte matematyczne , nie sumowanie rozmiarów jakichś
> struktur czy "przemiatanie" tablic)

Tak! Ale koderzy lubia sobie zamiast tylko przesuwac licznik, zmieniac
jego stan
stosujac dowolne operacje.

> reszta dla mnie jest całkowicie nieuzasadnionym wepchnieciem znaku tam gdzie
> jest on tylko pasożytem na wolnym ramie ;) (jakby nie było 1 bit a 2GB
> różnicy (czy 32 bitowym incie)).

Tak. Dlatego dopuszczam w klasach dedykowanych upchanie unsigned do
sekcji
prywatnej. Czyli na zewnatrz mozesz miec zakres typowy dla unsigned,
ale z zewnatrz operacje typu += sa dostepne w wersji kontrolowanej.

BTW mnie interesuja nie tylko typy opierajace sie o zakres min/max
typu.
Np. interesuje mnie double w zakresie [0,1], w takim przypadku tez mam
klase
wrapujaca, ktora rozwiazuje klopoty sama - enkapsulacja.

Seweryn Habdank-Wojewódzki

unread,
Feb 11, 2009, 11:24:44 AM2/11/09
to
Witam,
Witam,

> (przynajmniej w moim klepaniu w c), jedyne jakie pamietam mi sie swego czasu
> zdarzały to mieszanie typow liczbowych (mnozenie, dodwanie, odejmowanie,
> dzielenie wzajem intow i doubli, co mnie nauczyło ze trzeba dla pewnosci
> dodawac duzo rzutowan na spodziewane typy)

Rzutowanie nie zawsze rozwiazuje problem - jest to rozwiazanie, ale
nie zawsze
chcesz, aby to rozwiazanie bylo domyslne.

Rzuc sobie okiem na roznice pomiedzy static_cast a boost::numeric_cast
http://www.boost.org/doc/libs/1_38_0/libs/numeric/conversion/doc/html/index.html

profesor...@poczta.onet.pl

unread,
Feb 12, 2009, 8:23:23 AM2/12/09
to
Dwie sprawy

1.

Rozumiem ta argumentację

(-5) * 4 = (1000-5)*4 - 1000*4 = 3980 - 4000 = - 20

ale wydaje sie ze jest to wlasnie faktycznie tutaj odwolanie sie
do aksjomatow ciala a to zmienia jedynie postac problemu, (tu wyzej jest
zalozenie ze ten minus z mnozenia ma byc analogiem do minusa z dodawania
a to dla mnie nie jest jasne)


Zastanowilem sie do pewnego stopnia nad problemem choc w pewnym miejscu
tymczasowo przynajmniej wymiękłem:

myslmy o dodawaniu 'operatorowo' np jak o kroku do przodu czy dodaniu jabłka,
('operatory' dostawiam z lewej strony)

ododawnie i odejmowanie jest ok

5*4 =20 jest ok

5*(-4) = -20 jest ok (mnozyc przez całkowitą możemy nawet trąby jerychońskie
wiec mnozenie -4 nie stanowi dla mnie problemu)

(-5)*4

to jest totalna nowosc, przez analogie z dodawaniem (-5)* powinno być raczej
operacją odwrotną do 5*, ten minus jest minusem z mnozenia i zwykle oznacza
sie go
jako znak kresli ulamka (/5)*4, przez wprowadzenie takiego 'minusa mnozenia'
dostajemy
wszystkie dodatnie wymierne

mamy wiec teraz dodatnie i ujemne calkowite w dodawaniu i dodatnie wymierne w
mnozeniu,
(odpowiednio po prawej calkowite z dodawaniem odejmowaniem a po lewej
wymierne dodatnie z mnozeniem)

nie jest dla mnie jasne w tym momencie czy z tego od razu mamy
wymierne w dodawaniu, tj ze dodawanie odejmowanie poszerzylo nam sie
do wymiernych czy potrzebujemy jakichs warunkow spojnosci

mamy teraz liczby takie jak jedna trzecia (/3)*1 czy trzy drugie (/2)*3
czego potrzebujemy aby dostac (/3)*1 + (/2)*3 = (/6)*2 + (/6)*9 = (/6)*11
jedenascie szóstych ?

uzylismy

(3*(/2))*(3*3) czyli trzy razy pomozylismy nasze (/2)* na jablkach zarazem
same jablka mnozac 3* i zalozylismy ze wynik pozostanie bez zmian (wydaje mi
sie ze mozemy tak zrobic, jest to raczej sensowne a mnozenie mamy zdefinowane
zarowno w naszych wymiernych (czyli w operacjach mnozenia jabłek) jak i w tych
od dodawania czyli w samych jablkach)

i uzylismy

(/6)*2 + (/6)*9 = (/6)*(2+9) czyli rozdzielnosci mnozenie wzgledem
dodawania a*(2+3) = a*2 + a*3 (tez moim zdaniem mozemy to zrobic)


to są dwa zupelnie nowe zalozenia ale są raczej ok, wiec mamy teraz dodatnie
i ujemne wymierne w dodawaniu i dodatnie wymierne w mnozeniu

powracamy do problemu

(-5)*4

tylko teraz w miejsce piatki mozemy juz podstawic dowolna wymierna dodatnia
nie wiadomo natomiast dalej czym jest ten minus przed ta wymierna

Ten zapis moim zdaniem nie sugeruje specjalnie w zaden sposob ze ten minus
w wymiernych ma byc analogiem do minusa z dodawania, o ile wiem
(zawsze lubilem najbardziej algebre na studiach i dostawalem z niej
dobre oceny typu 4+) aksjomaty ciała (dalsze niz tu wymienione)
'wszywają' w naszą połprostą wymierną strukturę naszej polprostej
z dodawania, pewna ich unifikacja juz nastapila w tym co
tam wyzej przeprowadzilem ale ja nie zdefiniowalem w wymiernych po lewej
niczego typu (7+5)*4=7*4+5*4 (nie okreslilem (7+5)*4 ) tam po lewej mozna
tylko robic mnozenie

Aksjomaty ciala to wprowadzają i tu

(-5) * 4 = (1000-5)*4 - 1000*4 = 3980 - 4000 = - 20

to jest uzyte


Jesli zdecydowac sie 'wszysc' w polprosta wymierna to dodawanie
to oczywiscie pojawi sie tam ten minus z dodawania [i byc moze
od razu z tego by wynikało ze (-5)(-4) = 20 a byc moze nie do razu
ale akurat nie chce sie nad tym teraz zastanawiac]

Widac wiec ze w

(-5) * 4

jest zapostulowane ze ten minus z mnozenia ma byc analogiem do minusa
z dodawania.

Postuluje sie ze ten minus w

(-5)*4 = -20

ma byc analogonem do minusa z dodawania tylko ze w tej 'warstwie' (7+5)*4
lewostronnego mnozenia. Jakis sens to ma ale jest jest to chyba najbardziej
watpliwy z tych wszystkich krokow, ja urwalem swoje rozwazania przed nim
to znaczy nie 'wszywalem dodawania' w swoja polprosta wymierną i jest chyba
nadal pewne pytanie a nawet dwa (1) czy jest to wogole potrzebne dawac
dodawanie w tej polprostej wymiernej (2) czy nie ma alternatywnej wersji
zdefinowania tego minusa. (do tego problemu by trzeba moim zdaniem jeszcze
kiedys
wrocic, sens jaki dla mnie z tego wyniknal to zapamietanie
ktore aksjomaty ciala sa ok a ktore ( "(7+5)*4" ) zdeczka watpliwe)

jest tez jak wspomnialem niejasnosc czy z tego przyjecia (-5)*4 = -20
wynika (ew jak) ze (-5)*(-4) = 20 ale nie mam sily sie zastanawiac

Mam tu w sumie jeszcze ze powtorze niejaka niejasnosc, bo mozna tak zrobic
z tym uzyciem "(7+5)*4"; mozna zrobic 7 kopi paczek po cztery jablka
zrobic 5 kopi po cztery jabkla policzyc dodac jedno do drugiego i bedzie
to sie zgadzalo gdy sie doda operacje kopiowania skopiuje 12 racy paczke po
4 jablka i to sie bedzie zgadzac i chyba ten fakt ze to sie zgadza jest
powodem dla jakiego sie to robi, ale chyba tez jest cos w tym ze
w tym pierwotnym (-5)*4 nie jest dokladnie okreslone ze tan minus
ma miec taki charakter (i byc moze ma inny) niz taki jakiego nabiera
gdy sie robi to co sie wlasnie z nim robi :-/


2.

Jest jeszcze jedna sprawa, jakby spoza tamtych rozwazan ktore troche
wyglada stad mi ugrzęzły. Chyba nawet piątoklasista moze sobie 'skonstruowac'
(bez wnikań w glebsza algebre) takie mnozenie minusów

5*(-4) = -20
(-5)*4 = -20
(-5)*(-4) = --20

(--20)*(-2)=---40 itd

[mozna to nawet zaprogramowac przeznaczajac na minus nie bit ale np bajt,]

(ponizsze napisalem wczoraj i tylko wklejam bo nie chce mi sie powtarzac
na nowo wlasnymi slowami)

takie mnozenie minusow ma (warto zauwazyc)
ciekawe reperkusje, na przyklad w obecnej konstrukcji wykresy x^2
i x^3 itd nieprzyjemnie skaczą w lewej czesci ukladu kartezjańskiegop raz
w góre (np x^2, x^4) raz w dół (x^3, x^5). tutaj miałbyś nie jedną oś minusów
ale ich
nieskończoną prostopadłą do siebie ilość, (osie bylyby numerowane potegami
minusów)
i w lewej czesci ukladu wykresy zarowno x^2 jak i x^3 jak i x^4 odchylalyby
sie
niejako w bok - kazdy w swoj.
Jesli zdefiniować nie tylko 'minus do kwadratu' -^2 'minus do trzeciej'
-^3 ale i -^2.345 masz nawet ciągłą nieskonczoność prostopadłych osi,
(cos w podobie przestrzeni hilberta ale w fajowo prosty sposob)
funkcja (-1)^x (czyli (-^x)*1 dawalaby specyficzny zbior liczb,
po jednym punkcie na kazdej z tych osi, chyli defakto prostą nawet
nie prostopadłą (bo wszystkie -^x są
prostopadle wzajem do siebie) ale jakby HIPERprostopadłą do nich


miażdżyciel kamieni nerkowych

( glupi nik ale znowu po pożarciu ogromnej ilosci antybiotykow
od boreliozy jakis czas temu, znowu zaczynaj mnie paskudnie rwać rozmaite
bebechy i moje mysli zaczynaja krazyc wokol tematow medycznych (i tego calego
nieszczescia))

--
There's nothing sexier than a woman who rocks:
http://www.youtube.com/watch?v=MIWruBo9RcA

Maciej Piechotka

unread,
Feb 12, 2009, 2:55:36 PM2/12/09
to
"aviateur" <profesor...@poczta.onet.pl> writes:

Tak mi przyszo do głowy:

F = - kqQr/|r|^3

r to wektor, |r| jego długość, q i Q to ładunki a k to stała. Wzór znany
z gimnazjum.

'Sprawdzamy' dla q=Q=1C, r = [1 m, 0]
F = - k 1C^2 [1, 0] m / 1^3 m^3 = [- k C^3/m^2, 0]
Ładunku się odpychają

'Sprawdzamy' dla q=Q=-1C, r = [1 m, 0]
F = - k (-1 C)^2 [1, 0] m / 1^3 m^3 = [--- k C^3/m^2, 0]
Ładunki (wiemy z doświadczenia ;)) się odpychają:

--- k C^3/m^2 = - k C^3/m^2
--- 1 = -1
Dzieląc obie strony przez -1
--1 = 1

Ładna, fizyczna 'interpretacja zjawiska'.

aviateur

unread,
Feb 13, 2009, 6:36:10 AM2/13/09
to
> Witam,
> Witam,
>
> > (przynajmniej w moim klepaniu w c), jedyne jakie pamietam mi sie swego
czasu
> > zdarzały to mieszanie typow liczbowych (mnozenie, dodwanie, odejmowanie,
> > dzielenie wzajem intow i doubli, co mnie nauczyło ze trzeba dla pewnosci
> > dodawac duzo rzutowan na spodziewane typy)
>
> Rzutowanie nie zawsze rozwiazuje problem - jest to rozwiazanie, ale
> nie zawsze
> chcesz, aby to rozwiazanie bylo domyslne.
>
> Rzuc sobie okiem na roznice pomiedzy static_cast a boost::numeric_cast
>http://www.boost.org/doc/libs/1_38_0/libs/numeric/conversion/doc/html/index.ht
ml
>
no nie wiem szczerze moiwac, boost.. mnie c++ niezbyt interesuje
zwlaszcza zaawansowany

aviateur

Jędrzej Dudkiewicz

unread,
Feb 13, 2009, 6:39:48 AM2/13/09
to
aviateur wrote:
>> Rzuc sobie okiem na roznice pomiedzy static_cast a boost::numeric_cast
>> http://www.boost.org/doc/libs/1_38_0/libs/numeric/conversion/doc/html/index.ht
> ml
> no nie wiem szczerze moiwac, boost.. mnie c++ niezbyt interesuje
> zwlaszcza zaawansowany

Może niech Cię zainteresuje, będziesz miał wszelkie podstawy, żeby po
nim jeździć.

JD

kenobi

unread,
Feb 13, 2009, 6:53:25 AM2/13/09
to

ale to takie nudne.. zainteresowac sie trudnym i skomplikowanym c++
tylko po to by po nim jezdzic..? moze przyjdzie mi kiedys z musu
sie nim badziej zainteresowac.. poki co mam inne ciekawe tematyki

>
> JD

kenobi

unread,
Feb 16, 2009, 8:35:38 AM2/16/09
to
>
> ale to takie nudne.. zainteresowac sie trudnym i skomplikowanym c++
> tylko po to by po nim jezdzic..? moze przyjdzie mi kiedys z musu
> sie nim badziej zainteresowac..  poki co mam inne ciekawe tematyki
>
> >
> > JD
>
Poczytałem za to o 'teorii stanów cząstkowych' z 'c++ bez cholesterolu',
(nie całe jeszcze) Niezwykle łebski i ciekawy dla mnie tekst, z przełomowymi
wręcz dla mnie pojęciami (mam przy tym nadzieje ze w moim zyciu przelomowe,
nie znane mi wczesniej pojecia, nie beda sie zdarzac raz na 30 lat, ale raz na
pol roku albo i czesciej); nie znalem do tej pory wogole pojecia imperatywizmu
(programowania imperatywnego) a jest to bardzo ciekawe, jak również uwaga
"jedynym językiem "całkiem imperatywnym" jest asembler!". Pojęcie programowania
funkcjonalnego było mi znane z jakiegoś wątku na tej grupie i nieco kojarzyłem
o co chodzi (z językow ktore mozna by chyba okreslic mianem funkcjonalnych
znam tylko troche SQLa i jeszcze mniej wyrażenia regularne - jest w tym jakis
sens ale nie przepadam specjalnie za tym) ale spostrzeżenie że c jest w czesci
jezykiem funkcjonalnym i że wyrazenia tybu "r = a + b*c" niosą w sobie
funkcjonalizm,
czy też sa wyrazem funkcjonalizmu, jest niezwykle ważne. Jak mowie nie
doczytalem do
końca ale ten temat o którym mówi ten tekst jest wogóle niezwykle ważny

(kojarzy mi sie tu np pytanie ktore kiedyś tu zadałem czy lepiej jest
w pewnych przypadkach programowania które sie zdarzają
(np przy budowaniu w locie listy przedmiotow jakie niesie postac)
'przechowywac raz zbudowane wartosci w posrednim buforze i synchronizowac
stan tylko czasami gdy trzeba' czy tez 'tworzyc wszystko w locie'
(drugie jest znacznie prostsze i znacznie bezpieczniejsze ale
tez pierwsze jest istotnym algorytmicznym usprawnieniem programu)

- ale tez w tamtym tekscie jest chyba o wielu innych rzeczach
(chwilowo odpoczywam bo jak sie zmecze to odpoczywam (w ogóle stawy
mnie swędza od tej postboreliozy a i fujarka mnie boli jakby mnie ktoś
trzasnał siekiera miedzy nogami) ale trzeba bedzie wrocic do tamtego
tekstu jako niezwykle lebskiego tekstu)

grunge fightr (fir)

(Ps: Myślałem ostatnio czy nie przyjąć pseudonimu 'Korsarz' ale
wyszło mi że i tak o wiele za bardzo przygrzewam sobie
sygnaturami :( i ze jest to jednak pseudonim zarezerwowany
dla zawodowych linuksiarzy (tych długowłosych chudych (ale
niekoniecznie) kolesi z brodami i w swetrach (jak ten
jeden pod oknem z prawej na fotce z proamigowej sygnatury
jednego tutejszego grupowicza stąd - po lewej jest napis
cośtam że jakiś ośrodek biologii)
Pomyślałem nawet czy nie przestac sie golić żeby móc poskubać
sobie brode albo wąsy, (brody i tak troche ostatnio nie gole),
ale nie lepiej założe sweter.) (Zjadłem też dziś na śniadanie
kanapki z jakąś pastą z ryb coś w rodzaju paprykażu szczecińskiego)

fir

kenobi

unread,
Feb 17, 2009, 8:10:15 AM2/17/09
to
Zresztą ja docelowo interesuje sie grami, coś raczej w takiej stylistyce ->

http://www.starbreeze.com/

lub podobne, (niestety mam swiadomosc ze jestem na to obecnie o wiele
za cienki), boost mi tam sie raczej by chyba nie przydał


kenobi

0 new messages