div και mod με αρνητικους

Ξεκίνησε από apanagio, 08 Δεκ 2014, 09:19:43 ΠΜ

« προηγούμενο - επόμενο »

apanagio

Όπως έχει συζητηθεί κι εδώ:
https://alkisg.mysch.gr/steki/index.php?topic=755.0
η συμπεριφορά των div και mod ίσως να ξενίζει τους μαθητές μας όταν τα ορίσματα είναι αρνητικοί αριθμοί.

Σύμφωνα με τα μαθητικά    0 < α mod β <=  β  για θετικούς β
Στο pseudoglossa.gr
-9 mod 2 = -1

Αν και δεν είναι μέσα στην ύλη μήπως θα ήταν καλύτερα να αλλάξει η υλοποίηση και να συμφωνεί με τον μαθηματικό ορισμό;

sstergou

Και ποιος είναι ο μαθηματικός ορισμός;
Εδώ πάντως τα πράγματα δεν είναι καθόλου ξεκάθαρα.

apanagio

Στη wikipedia που κάνεις link λέει:
Παράθεση
In mathematics the result of the modulo operation is the remainder of the Euclidean division.

Και η ευκλείδεια διαίρεση ορίζεται:
Παράθεση
Given two integers a and b, with b ≠ 0, there exist unique integers q and r such that a = bq + r and 0 ≤ r < |b|

Διάφορες γλώσσες προγραμματισμού έχουν και διαφορετική προσέγγιση.

sstergou

Δηλαδή αν κατάλαβα καλά λες ότι πρέπει να επιστρέφει πάντα θετικό;

Υπάρχει κάποιος λόγος πέραν του μαθηματικού ορισμού όπου αυτό πρέπει να συμβαίνει;

apanagio

Ναι αυτό λέω.

Εκεί που μου προέκυψε το πρόβλημα ήταν όταν σε μια άσκηση ένα παιδί ήθελε να δει αν ένας αριθμός είναι άρτιος ή περιττός. Κάνοντας έλεγχο με
x mod 2 = 1
δεν του δούλευε για αρνητικούς.


sstergou

#5
Πάντως το έχει στα common pitfalls! http://en.wikipedia.org/wiki/Modulo_operation#Common_pitfalls

Από την άλλη το 9 mod 2 έχει μια λογική να είναι διαφορετικό από το -9 mod 2.

Δεν ξέρω, αν το θέλουν και άλλοι να το αλλάξω.


apanagio

Ναι το ξέρω,
Το συναντησα πρώτη φορά στην άσκηση του βιβλίου (και του algo.pk)
"να διαβάζει έναν ακέραιο και να επιστρέφει τον επόμενο άρτιο"

Κανένας

Παράθεση από: sstergou στις 08 Δεκ 2014, 02:45:27 ΜΜ
Και ποιος είναι ο μαθηματικός ορισμός;
Εδώ πάντως τα πράγματα δεν είναι καθόλου ξεκάθαρα.

Εὐκλείδεια διαίρεση:
Γιὰ κάθε Ϲεῦγος ἀκεραίων (a, b) μὲ b > 0 ὑπάρχει ἕνα μοναδικὸ Ϲεῦγος ἀκεραίων (q, r), τέτοιο ὥστε
a = bq + r καὶ 0 ≤ r < b .
Στὴ σχέση αὐτὴ ὁ a χαρακτηρίζεται διαιρετέος καὶ ὁ b διαιρέτης. ῾Ο q ὀνομάζεται
(ἀκέραιο) πηλίκο τῆς διαίρεσης τοῦ a διὰ b καὶ ὁ r ὑπόλοιπο τῆς διαίρεσης.

Δηλαδή ακέραιο πηλίκο q ορίζουμε τον μεγαλύτερο ακέραιο για τον οποίο ισχύει bq<=a.
π.χ.   όπως (9 div 2=4 και 9 mod 2=1) διότι 4*2<9
    και όχι (9 div 2=5 και 9 mod 2=-1) διότι 5*2>9

   έτσι και (-9 div 2=-5 και -9 mod 2=1) διότι (-5)*2<-9
    και όχι (-9 div 2=-4 και -9 mod 2=-1) διότι (-4)*2>-9
Νικηφόρος Μανδηλαράς
ΓΕΛ Νάξου "Μανώλης Γλέζος"
https://blogs.sch.gr/nobody/

gpapargi

Στάθη είχαμε πει πιο παλιά να ακολουθήσουμε τον ορισμό της ακέραιας διαίρεσης  του Ευκλείδη όπως αυτός περιγράφεται στο βιβλίο των μαθηματικών κατεύθυνσης της Β λυκείου. Να υπάρχει και συνέχεια μεταξύ των βιβλίων και ειδικά να είμαστε σύμφωνοι με τα μαθηματικά που κάνουν τα παιδιά (έστω και με τα εκτός ύλης κομμάτια).

sstergou

Αφού υπάρχει συμφωνία θα το αλλάξω.

gpapargi

Από ότι θυμάμαι είχε συζητηθεί στο πλαίσιο των ασαφειών της ΑΕΠΠ. Προβλημάτιζε και τον Άλκη το τι θα υλοποιήσει στο Διερμηνευτή.
https://alkisg.mysch.gr/steki/index.php?topic=914.0

Κανένας

Παράθεση από: gpapargi στις 09 Δεκ 2014, 11:24:56 ΠΜ
Στάθη είχαμε πει πιο παλιά να ακολουθήσουμε τον ορισμό της ακέραιας διαίρεσης  του Ευκλείδη όπως αυτός περιγράφεται στο βιβλίο των μαθηματικών κατεύθυνσης της Β λυκείου. Να υπάρχει και συνέχεια μεταξύ των βιβλίων και ειδικά να είμαστε σύμφωνοι με τα μαθηματικά που κάνουν τα παιδιά (έστω και με τα εκτός ύλης κομμάτια).

Το θεώρημα της ακεραίας διαίρεσης  του Ευκλείδη στο βιβλίο των μαθηματικών κατεύθυνσης της Β λυκείου διατυπώνεται ως εξής:
Αν α και β ακέραιοι με β≠0 , τότε υπάρχουν μοναδικοί ακέραιοι κ και υ, τέτοιοι, ώστε
α=κβ+υ, 0≤υ<|β|.
και είναι ισοδύναμο με το παρακάτω:

Γιὰ κάθε Ϲεῦγος ἀκεραίων (a, b) μὲ b > 0 ὑπάρχει ἕνα μοναδικὸ Ϲεῦγος ἀκεραίων (q, r), τέτοιο ὥστε
a = bq + r καὶ 0 ≤ r < b .

στο οποίο απαιτείται ο διαιρέτης b να είναι θετικός ακέραιος (φυσικός)
δεδομένου ότι a/-b=-a/b και -a/-b=a/b.

Ο τελεστής mod όπου εφαρμόζεται πάντως πρέπει να επιστρέφει μη αρνητικό αποτέλεσμα.
Νικηφόρος Μανδηλαράς
ΓΕΛ Νάξου "Μανώλης Γλέζος"
https://blogs.sch.gr/nobody/

sstergou

Ωραία, το άλλαξα. Τώρα δουλεύει ως εξής:
function(a:Number, b:Number):Number {
	var r:Number = a % b;
	return r >= 0 ? r : r + Math.abs(b);
}

apanagio

Θα πρέπει να αλλάξεις και το div για να συμφωνεί.  :)


sstergou

Διαφώτισέ με λίγο για να μην ψάχνομαι, το παρακάτω εμφανίζει σε όλα Αληθής.
αλγοριθμος ταδε
για α από -10 μέχρι 10
	για β από 1 μέχρι 3
		πηλικο ← α div β
		υπολοιπο ← α mod β
		απ ← πηλικο * β + υπολοιπο
		γραψε α, β, απ, απ = α
	Τέλος_επανάληψης
τελος_επαναληψης
τελος ταδε