Μερικά πολύ βασικά για τούς πραγματικούς

...ασύγχρονα μαθήματα από τους guru της κοινότητας

Συντονιστής: the_eye

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό Dimitris » 14 Δεκ 2011, 10:37

Off topic:
@lucinos: Σχετικά με το σύνδεσμο, δε ξέρω τι γίνεται. Εμένα μια χαρά μου ανοίγει.

@the_eye: πολύ καλή αυτή η δυνατότητα. Δεν την ήξερα.

@kalakouentin: και νόμιζα ότι είχες φύγει από το forum. Χαίρομαι που είσαι έστω και περιστασιακά εδω τριγύρω. Το βιβλίο του Strogartz δεν το έχω διαβάσει, αλλα θα προσπαθήσω να το τσεκάρω στην πρώτη ευκαιρία.

lucinos έγραψε:Ο μη ειδικός αυτό που πρέπει να κρατήσει είναι όταν έχει προσέγγιση να μην απαιτεί ισότητα.

Ακριβώς. Και σε μία γλώσσα που επίτρεπει υπερφόρτωση τελεστών, μπορεί να ορίσει για τους floating point αριθμούς ότι ο έλεγχος για ισότητα αντιστοιχεί σε έλεγχo , για κάποια νόρμα και η επιθυμητή ακρίβεια, η οποία κι αυτή με τη σειρά της μπορεί να αλλάζει.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό lucinos » 18 Δεκ 2011, 17:53

Το βιβλίο τού S.H.Strogatz το έχω διαβάσει, από εκεί και πέρα είμαι περισσότερο επηρεασμένος από τον Wolfram και τον Prigogine (ανεξάρτητα, δεν τούς συνδέω), αλλά βεβαίως οι πεποιθήσεις μας είναι πολύ διαφορετικό θέμα.

@Dimitris
Ναι μπορείς να υπερφορτώσεις τον τελεστή == αλλά αυτό δεν σημαίνει ότι είναι καλή ιδέα. Και για να σε προλάβω, ξέρω πολύ καλά ότι το κάνει αυτό το Mathematica. Ως κάποιος που για μια περίοδο είχε λιώσει στο Mathematica, έχω την γνώμη ότι εδώ κάνει λάθος. Και για να είμαι ξεκάθαρος, το να χρησιμοποιείται μια αυτόματη προσέγγιση σε συναρτήσεις όπως η FindRoot είναι προφανώς καλό, εκεί δεν έχω καμμία ένσταση. Αλλά εκεί είναι ένας «αυτοματισμός» σε μια αριθμητική επίλυση μιας συμβολικής εξίσωσης. Αυτό είναι πολύ διαφορετικό από την υπερφόρτωση τού τελεστή για σύγκριση δύο αριθμών. Όταν θέλεις για οποιονδήποτε λόγο να κάνεις ο ίδιος τον αλγόριθμο, τότε πρέπει να έχεις ο ίδιος τον έλεγχο τής ακρίβειας και η γλώσσα δεν πρέπει καν να ενθαρρύνει σε τέτοιου είδους «συντομογραφίες».

Η αλήθεια είναι πάντως ότι δεν περίμενα ότι θα είχε τόσο αρνητική αντιμετώπιση η χρήση τής λέξης «πραγματικός», από κάποιον που ξέρει Fortran, όσο για την χρήση τού παράξενου ελκυστή, επαναλαμβάνω απλώς ότι η πρόθεσή μου ήταν απλώς να τονίσω λίγο παραπάνω την χαοτική φύση τού σφάλματος. Ο παράξενος ελκυστής μού αρέσει σαν παράδειγμα γιατί δεν μπορείς καν να ελπίζεις ότι θα παρακάμψεις το πρόβλημα (γιατί υπάρχει _και_ θεμελιώδες πρόβλημα) και επιπλέον είναι ωραίο σχήμα.

ξέχασα να αναφέρω ότι τον σύνδεσμο τον έχεις διορθώσει και λειτουργεί. (δεν τον είχες έτσι όταν πρωτοκοίταξα). Κοιτώντας το τελικό αποτέλεσμα είναι το αναμενόμενο, δηλαδή ότι η ακρίβεια αυξάνεται αναλογικά με την ακρίβεια σε ψηφία (ή εκθετικά με την ακρίβεια σε απόλυτους αριθμούς). Αν έχω μια παρατήρηση είναι ότι είναι υπερβολικά αναμενόμενο, σε βαθμό που δυσκολεύομαι να το πιστέψω... :wtf:
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό Dimitris » 18 Δεκ 2011, 20:41

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

Off topic:
Fortran. Τι μου θύμησες; Εδω εγώ προσπαθώ να τη ξεχάσω. :lol:
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό kalakouentin » 19 Δεκ 2011, 01:36

Νομίζω ότι διυλίζουμε τον κώνωπα... Απλά δεν ήταν ιδιαίτερα δόκιμος ως παράδειγμα, ο ελκυστής Lorentz.

Ας πέσουμε στην παράνοια όμως... Νομίζω ότι ακόμα και το αρχικό προγραμματιστικό παράδειγμα είναι τουλάχιστον "μη γενικεύσιμο". Κατηγορείς τρόπον τινά, την C για κάτι που δεν φταίει. Σε C/C++ (και σε κάθε γλώσσα προγραμματισμού) όπως είπες και εσύ σωστά, το θέμα βρίσκεται στον τρόπο αναπαράστασης/αποθήκευσης των μεταβλητών. Άρα τo να λες ότι:
lucinos έγραψε:To σφάλμα δεν οφείλεται σε κακό προγραμματισμό. Η φύση τού προβλήματος το δημιουργεί. Δεν θα μπορούσαμε να απαλλαγούμε.
είναι λάθος. Οφείλεται καθαρά σε κακό προγραμματισμό. Στην περίπτωση με τα equality relations: γιατί θεωρήθηκε ότι υπάρχει infinite αντί για finite precision arithmetic. Αυτό δεν είναι "χαοτικό" λοιπόν, απλά άθελα μας εθελοτυφλούμε.
Eίναι θέμα υλοποίησης (*) και όχι χάους. Σε τέτοια θέματα ο υπολογιστής σου είναι αρκούντως ντετερμινιστικός. Όπως προανέφερα, η ανεξήγητη συμπεριφορά ενός συστήματος δε σημαίνει πάντα ότι είναι δάκτυλος του Χάους, ίσως είναι του χρήστη...

Spoiler: show
(*)Aν υποθέσουμε ότι μιλάμε για C99, κάνοντας ένα copy-paste από το Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3 βλέπουμε ότι η ισότητα ορίζεται ως :
§6.5.9 έγραψε:The == (equal to) and != (not equal to) operators are analogous to the relational operators (§6.5.8) except for their lower precedence (αν έχουμε δηλαδή (a<b == c<d). Εach of the operators yields 1 if the specified relation is true and 0 if it is false. The result has type int. For any pair of operands, exactly one of the relations is true.
If both of the operands have arithmetic type, the usual arithmetic conversions are performed. Values of complex types are equal if and only if both their real parts are equal and also their imaginary parts are equal. Any two values of arithmetic types from different type domains are equal if and only if the results of their conversions to the (complex) result type determined by the usual arithmetic conversions are equal.
Όπου με usual arithmetic conversion (§6.3.1.8) εννοεί το ότι (κατά σειρά προτεραιότητας) αν ένας απο τους 2 operands είναι long double, γίνεται και ο άλλος long double αλλιώς αν ένας είναι double γίνεται και ο άλλος double αλλιώς, float και ο άλλος float, κάτω από int δεν πάει (λένε κάτι για unsigned ints αλλά ντάξει λεπτομέρειες). Τα relational-operators είναι τα γνωστά ( <, >, <=, >= ), τα οποία με τη σειρά του βασίζονται στα Bitwise shift operators.
Με Βitwise οperations γίνεται η δουλειά, άρα προφανώς "ότι σώσεις, θα συγκρίνεις". :)

Στο παράδειγμα σου αν ο χρήστης ήταν αρκετά "αδαής" για να γράψει "cout << ( int(1.2 - 1. ) == int(.2))<< endl;" το όρισμα θα επέστρεφε TRUE όπως και αν έγραφε "cout << ( abs((1.2 - 1. )- (.2)) < 1e-16) << endl;" (πρακτικά γράφοντας εκτενώς το overloading που πρότεινε ο Dimitris παραπάνω). Tέλος στο ίδιο ακριβώς παράδειγμα αν γράψεις "cout << ( float(1.2 - 1. ) == float(.2))<< endl;" θα επιστρέψει και πάλι TRUE, γιατί δεν χρησιμοποίησες doubles (float: 7 bit precision, double: 15 bit precision) και μπόρεσε να κάνει το rounding ανώδυνα.

@Dimitris: ε γιορτές που είναι, διακοπές μετά από καιρό... ;)
Εικόνα
Γνώσεις ⇛ Linux: Συμπαθητικές ┃ Προγραμματισμός: Συμπαθητικότερες ┃ Αγγλικά: Αστέρι
Λειτουργικό ⇛ Ubuntu 10.04 32bit σε HP nw9440 ┃ Ubuntu 10.04 32bit σε Toshiba Satellite U400┃ SLED 11 64bit σε Dell OptiPlex 780
kalakouentin
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 545
Εγγραφή: 05 Ιούλ 2008, 05:50
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό lucinos » 19 Δεκ 2011, 05:19

@kalakouentin
όταν έγγραφα ότι δεν οφείλεται σε κακό προγραμματισμό εννοούσα, «δεν φταίνε οι προγραμματιστές τής C» (τού gcc κλπ). Εσύ τι κατάλαβες;
δηλαδή ακριβώς επανόρθωνα για την C.

Σε τέτοια θέματα ο υπολογιστής σου είναι αρκούντως ντετερμινιστικός.

Προσωπικά με απασχολεί ακριβώς το χάος που προκύπτει μέσα από απλά ντετερμινιστικά μοντέλα. Ντετερμινισμός και χάος όχι απλώς συμβαδίζουν αλλά αρκετοί τον βάζουν σαν προϋπόθεση.
πχ στον Strogatz:
"Chaos is aperiodic long-term behavior in a deterministic system that exhibits sensitive dependence on initial conditions."
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό kalakouentin » 19 Δεκ 2011, 08:28

Σωστά. Ήταν ασαφής η διατύπωση μου. "Ο υπολογιστής σου είναι αρκούντως προβλέψιμος" θα ήταν πιο δόκιμο και λιγότερο παρερμηνεύσιμο. Αναφερόμουν σε ντετερμινιστικούς και μη-ντετερμινιστικούς αλγόριθμους· κοινώς κάθε εκτέλεση παράγει τα ίδια/επεξηγήσιμα αποτελέσματα άσχετα άμα αρχικά φαίνονται "απρόβλεπτα". Ίσως θα μπορούσα να πω "αρκούντως γραμμικός". Αλλά νομίζω και αυτό θα ήταν αμφίσημο από μόνο του. (Προφανώς υπάρχουν και χαοτικά συστήματα σε πεπερασμένες διαστάσεις ενός "κοινού" υπολοστικού αλγόριθμου αλλά δεν είναι ο "κανόνας" σε ένα badly-behaved πρόγραμμα.)
(Γενικά δεν ξέρω καν τί εννοείται ως μη-ντετερμινιστικό χάος. Η συντριπτική πλειοψηφία της βιβλιογραφίας του "Χάους" είναι για "Ντετερμινιστικό Χάος" άρα είναι σχεδόν περιττό να λες ότι αναφέρεσαι σε ντετερμινιστικά συστήματα. - Και ο ορισμός του Strogatz είναι κάπως φτωχός (είπα ότι το θεωρώ sloppy βιβλίο), δεν αναφέρεται καθόλου ούτε σε dimensionality ούτε σε topological mixing· γενικά, δεν υπολογίζουμε έναν Lyapunov exponent και άντε πάμε!)

Όταν είπες
lucinos έγραψε: Το σφάλμα δεν εξαρτάται από την Python. Η Python χρησιμοποιεί απλά την C. Επομένως η ευθύνη πέφτει στην C.
Ήταν φυσιολογικό να υποθέσω ότι δεν εννοείς του προγραμματιστές στην AT&T αλλα ότι εννοούσες ότι η ευθύνη πέφτει πάνω στους περιορισμούς της C, που θα είχε όπως οποιαδήποτε άλλη γλώσσα προγραμματισμού. Και επικεντρώθηκα στο γεγονός ότι οι χρήστες φταίνε αν δεν αναγνωρίζουν τους περιορισμούς.

Όπως είπα: Καλό το άρθρο, όχι τόσο καλό το παράδειγμα!

Με τί είδους ντετερμινιστικά μοντέλα απασχολήσε που ανέφερες?
Εικόνα
Γνώσεις ⇛ Linux: Συμπαθητικές ┃ Προγραμματισμός: Συμπαθητικότερες ┃ Αγγλικά: Αστέρι
Λειτουργικό ⇛ Ubuntu 10.04 32bit σε HP nw9440 ┃ Ubuntu 10.04 32bit σε Toshiba Satellite U400┃ SLED 11 64bit σε Dell OptiPlex 780
kalakouentin
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 545
Εγγραφή: 05 Ιούλ 2008, 05:50
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό lucinos » 19 Δεκ 2011, 09:21

οκ, δεν απασχολούμαι με αυτό ακριβώς, απλά «με απασχολεί», μην το τραβάμε περισσότερο από όσο πρέπει. Νομίζω ανέφερα τις κατευθύνσεις στα ψιλά γράμματα αλλά για να πάρεις μια ιδέα τών απόψεών μου:
http://en.wikipedia.org/wiki/A_New_Kind_of_Science
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό migf1 » 19 Δεκ 2011, 14:55

Dimitris έγραψε:Ακριβώς. Και σε μία γλώσσα που επίτρεπει υπερφόρτωση τελεστών, μπορεί να ορίσει για τους floating point αριθμούς ότι ο έλεγχος για ισότητα αντιστοιχεί σε έλεγχo , για κάποια νόρμα και η επιθυμητή ακρίβεια, η οποία κι αυτή με τη σειρά της μπορεί να αλλάζει.


Πάνω που πήγαινα να γράψω πως καλή η διαπίστωση ενός προβλήματος, αλλά ακόμα καλύτερη όταν συνοδεύεται με προτάσεις επίλυσής του (έστω και προσεγγιστικά). Οπότε το παραπάνω είναι μια πιθανή λύση (όχι και τόσο χρησιμοποιούμενη πλέον, λόγω του μεγάλου σφάλματος που ενδέχεται να προκύψει).

Υπάρχουν κι άλλες. Για όποιον ενδιαφέρεται, βρίσκω αυτή τη δημοσίευση αρκούντως πρακτική για σύγκριση floating αριθμών: http://www.cygnus-software.com/papers/c ... floats.htm (αν ψαχτείτε θα βρείτε πολλές σχετικές δημοσιεύσεις).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Μερικά πολύ βασικά για τούς πραγματικούς

Δημοσίευσηαπό lucinos » 20 Δεκ 2011, 11:08

Δέν είμαι βέβαιος ότι κάποια προβλήματα _πρέπει_ να τα λύνουμε. Ή ακριβέστερα, οι «λύσεις», δεν είναι ακριβώς _λύσεις_.

Για παράδειγμα ή δημοσίευση τού Bruce Dawson δεν αμφιβάλω ότι έχει πρακτική χρησιμότητα αλλά:
The trouble with this function is that AlmostEqualRelative(x1, x2, epsilon) may not give the result as AlmostEqualRelative(x2, x1, epsilon),

Δυσκολεύομαι πολύ να το δω αυτό σαν «πρόβλημα». Λογικά αν κάποιος ανησυχεί για κάτι τέτοιο, οφείλει έτσι και αλλιώς να αυξήσει την ακρίβεια, και συνήθως είναι πολύ απλούστερο ένα πολύ πιο βάρβαρο κόψιμο. (μέτρα με συμβολόμετρο, σημάδευε με κιμωλία, κόβε με τσεκούρι :) ). Το βασικό πλεονέκτημα που βλέπω στην μέθοδο τού Dawson είναι στην ενδεχόμενη απόδοση και αμφιβάλω αν αυτή είναι σημαντική ή αν σε ειδικές περιπτώσεις δεν υπάρχουν ακόμα καλύτερες λύσεις. Σε κάθε περίπτωση βέβαια ο ισομορφισμός αυτός τών «πραγματικών» (κινητής υποδιαστολής) με τών «ακεραίων» είναι πολύ χρήσιμο να την έχει υπόψιν του κάποιος που προγραμματίζει σε C.

Floating point math is never simple.


Την C φυσικά δεν θα την πείραζα αλλά αν σχεδίαζα ο ίδιος μια αλά Mathematica γλώσσα η λύση μου θα ήταν πολύ πιο απλή. Ενώ θα ήθελα να παρέχονται αυτοματοποιημένα εργαλεία (που η ακρίβεια θα είναι αυτοματοποιημένη αλλά και να την καθορίζει ο χρήστης αν θέλει, όταν ο υπολογιστής θα έβλεπε ένα == (ή ένα != ) με αίτημα επιστροφής True ή False και να συγκρίνονται «πραγματικοί» (και όχι ακέραιοι, ρητοί ή συμβολικοί πραγματικοί) ο υπολογιστής να δίνει ένα WARNING. Δεν θα επιχειρούσα καμμία προηγμένη λύση, και δεν θα το απαγόρευα τελείως μόνο και μόνο γιατί δεν μού αρέσει να απαγορεύω πράγματα.
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Προηγούμενη

Επιστροφή στο Το Σχολείο του Φόρουμ - Ασύγχρονα Μαθήματα