[#1] Dzielę przez zero! :)
Czy to normalne, że GCC 2.95.x pod MorphOS potrafi dzielić przez zero? Nie ma żadnego ostrzeżenia, żadnego błędu, logi czyste. Taki "kod" daje wynik 0;

int zerko = 0;
int niezerko = 13;
int wyniczek = -46;
wyniczek = niezerko / zerko;
printf("wyniczek = %dn", wyniczek);

To jakiś babol czy to jest zrobione specjalnie dla "bezpieczeństwa"?

Trafiłem na to przenosząc swoje wypociny na inną platformę i tam dostałem błędy (co jest raczej oczywiste). Na MorphOS moje wypociny śmigają aż miło patrzeć i dlatego nie zauważyłem tej drobnej pomyłki w moim kodzie (dzielenie było przed warunkiem, a powinno być po).



Ostatnia modyfikacja: 17.08.2008 12:31:16
[#2] Re: Dzielę przez zero! :)

@MDW, post #1

powinien chyba walnąć wyjątkiem procesora

[#3] Re: Dzielę przez zero! :)

@MDW, post #1

A tak z ciekawosci to jaki daje wynik?

[#4] Re: Dzielę przez zero! :)

@Lorak, post #3

Dzielenie przez zero dwóch liczb typu int daje mi zawsze wynik równy zero.

[#5] Re: Dzielę przez zero! :)

@MDW, post #1

Powinieneś się cieszyć że działa, a nie, jeszcze marudzić. ;)

[#6] Re: Dzielę przez zero! :)

@MinisterQ, post #5

O.

A ja trzymam kciuki za perpetuum mobile!

[#7] Re: Dzielę przez zero! :)

@MDW, post #4

W sumie dziwne bo powinien dac nieskonczonosc... ;)

[#8] Re: Dzielę przez zero! :)

@Lorak, post #7

W rzymskim systemie zapisywania liczb zera nie było wcale i dawali sobie radę. ;)
A cyfry arabskie nie pochodzą z Arabi tylko z Indii - http://pl.wikipedia.org/wiki/Cyfry_arabskie
A tu o historii zera - http://pl.wikipedia.org/wiki/Historia_liczb#Dzieje_zera
[#9] Re: Dzielę przez zero! :)

@Lorak, post #7

nieskonczonosc daje przy typach rzeczywistych (float/double). przy calkowitych powinien byc wyjatek. czemu uzytkownik go nie widzi, nie wiem:)

[#10] Re: Dzielć przez zero! :)

@MDW, post #1

Moze ten kompilator jest przewidziany do kompilacji programow pod Pentium? ;)
Sparwdzilem na Sas C. Po uruchomieniu dostalem GURU "Divide by zero" jednak jak dalem continue otrzywalem wynik 13.
[#11] Re: Dzielć przez zero! :)

@Phibrizzo, post #10

13

wiedziałem, że z tą liczbą jest coś nie tak :)

[#12] Re: Dzielę przez zero! :)

@kiero, post #9

Nie używam wyjątków w MOSowym C++, bo podobno średnio one działają. Np. zamiast new używam new(std:nothorw) i sprawdzam NULLa.

[#13] Re: Dzielę przez zero! :)

@MDW, post #12

Kierowi o wyjątek procesora chodziło raczej... Sprawdź w debuglogu, czy Ci nie wyrzuca jakiegoś.

[#14] Re: Dzielę przez zero! :)

@Grzegorz Kraszewski, post #13

Z tego co pamiętam to zerkałem do debugloga i nie zauważyłem nic czerwonego. Jeszcze się upewnię. Chociaż to nie ma wielkiego znaczenia. Tak po prostu zapytałem. :)

[#15] Re: Dzielę przez zero! :)

@MDW, post #14

Nie nieskończoność - dzielenie przez zero jest niewykonalne. Według mnie kompilator przy dzieleniu nie stosuje komendy procesora, tylko własną procedurę.

[#16] Re: Dzielę przez zero! :)

@Minniat, post #15

oczywiscie, ze dzielenie przez zero jest wykonalne. i tak, kompilator stosuje instrukcje procesora. inaczej byloby to strasznie nieefektywne.

[#17] Re: Dzielę przez zero! :)

@kiero, post #16

Sprawdziłem w ASM-ONE. Dzielenie przez zero wywołuje GURU. Procedura tworzona przez kompilator najwyraźniej sprawdza czy dzielnik jest różny od zera.

[#18] Re: Dzielę przez zero! :)

@Minniat, post #17

napisalem ci wczesniej. przy dzieleniu liczb rzeczywistych nie ma wyjatku. wyjatek jest przy dzieleniu liczb calkowitych. procedura niczego nie sprawdza bo nie ma zadnej procedury tworzonej przez kompilator.

[#19] Re: Dzielę przez zero! :)

@Minniat, post #17

a bierzesz pod uwagę że rozmawiamy od dwóch różnych procesorach ?

[#20] Re: Dzielę przez zero! :)

@rzookol, post #19

to nie ma znaczenia

[#21] Re: Dzielę przez zero! :)

@kiero, post #20

no to czy nie ma znaczenia to trzeba by bylo porównać to co zapisał w Asmone do tego co wypluł gcc

[#22] Re: Dzielę przez zero! :)

@rzookol, post #21

ale gcc tez nie generuje osobnej funkcji do realizowania dzielenia.

[#23] Re: Dzielę przez zero! :)

@MDW, post #14

A może masz dołączony moduł liczb urojonych w swoim projekcie i stąd ta "otwartość" kompilatora na dzielenie przez zero? ;) :P
[#24] Re: Dzielę przez zero! :)

@MDW, post #14

Witam,

A mógłbyś wkleić źródełko w asm jakie daje gcc -S. Tak z czystej ciekawości chciałbym obejrzeć. Z góry dziękuje.

Pozdrawiam

[#25] Re: Dzielę przez zero! :)

@asman, post #24

Taki wynik daje kompilacja bez asemblacji DCC -a

; z = x/y;

move.l D7,D0
move.l D6,D1
jsr __divs(pc)
move.l D0,D5

Jak widać kompilator stosuje odrębną procedurę do dzielenia, która
sprawdza czy dzielnik jest różny od zera.

Taki kod wpisałem w Asm-One:

moveq #5,d0
moveq #0,d1
divs d1,d0

Dodatkowo funkcja biblioteczna IEEESPDiv() biblioteki matematycznej mathieeesingbas, jako że nie może zwrócić błędu przy dzieleniu przez zero zwraca dzielną. Jako ciekawostkę podam, że Dice C radzi sobie bez problemu z bibliotekami matematycznymi (otwiera je automatycznie), a GCC ma problemy.

[#26] Re: Dzielę przez zero! :)

@asman, post #24

GCC m68k (3.4):

parametry:
-Wall -Wno-parentheses
-fno-strict-aliasing

LC0:
.ascii "wyniczek = %d12"
.even
.globl _dzielenie

_dzielenie:
link a5,#0
clrl sp@-
pea 13:w
jbsr ___divsi3
addqw #4,sp
movel d0,sp@
pea LC0
jbsr _printf
unlk a5
rts

GCC 2.95.3/MOS

parametry:
-Wall -Wno-parentheses
-Os

.LC0:
.string "wyniczek = %dn"
.section ".text"
.align 2
.globl dzielenie
.type dzielenie,@function
dzielenie:
stwu 1,-16(1)
mflr 0
stw 0,20(1)
li 0,0
li 4,13
lis 3,.LC0@ha
la 3,.LC0@l(3)
divw 4,4,0
crxor 6,6,6
bl printf
lwz 0,20(1)
mtlr 0
la 1,16(1)
blr

OS4/GCC 3.x

.LC0:
.string "wyniczek = %dn"
.section ".text"
.align 2
.globl dzielenie
.type dzielenie, @function
dzielenie:
mflr %r0
stwu %r1,-16(%r1)
li %r4,13
lis %r3,.LC0@ha
la %r3,.LC0@l(%r3)
stw %r0,20(%r1)
li %r0,0
divw %r4,%r4,%r0
crxor 6,6,6
bl printf
lwz %r0,20(%r1)
addi %r1,%r1,16
mtlr %r0
blr



Ostatnia modyfikacja: 21.08.2008 10:14:01
[#27] Re: Dzielę przez zero! :)

@Minniat, post #25

Zawsze możesz napisać własny kod startowy który również otworzy biblioteki matematyczne, i na upartego potem możesz z nich przecież korzystać w kodzie. Tylko właściwie - po co?

[#28] Re: Dzielę przez zero! :)

@MinisterQ, post #26

a kod dla 68k skompilowales dla 020+? dla 68000 nie ma 32bitowego dzielenia i musi uzyc funkcji. w 020+ taka operacja jest bezposrednio wspierana przez procesor.

[#29] Re: Dzielę przez zero! :)

@kiero, post #28

Istotnie:

po dodaniu parametru -m68020 mamy w wyniku taki oto kod:

LC0:
.ascii "wyniczek = %d12"
.even
.globl _dzielenie
_dzielenie:
link a5,#0
movel d2,sp@-
moveq #13,d0
clrl d2
divsl d2,d0
movel d0,sp@-@-
movel _Sy
pea LC0
jbsr _printf
movel a5@(-4),d2
unlk a5
rts


[#30] Re: Dzielę przez zero! :)

@MinisterQ, post #29

no i prosze. zadnego sprawdzania argumentow i zadnego wywolywania dodatkowych procedur.



Ostatnia modyfikacja: 21.08.2008 10:31:08
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem