Leite33 Δημοσ. 25 Οκτωβρίου 2015 Δημοσ. 25 Οκτωβρίου 2015 Καλημέρα Θα ήθελα λίγο τα φώτο σας σε C προγραμματισμό. Προσπαθώ να υλοποιήσω μια μικρή άσκηση που μετατρέπει καρτεσιανές συντεταγμένες σε πολικές συντεταγμεένες και θα τυπώνει το απότελεσμα στην οθόνη. double csinta, csintb; double psinta, psintb; printf("\n\nEnter the values of the cartesian coordinates\n"); scanf("%lf %lf", &csinta, &csintb); psinta=sqrt(csinta*csinta+csintb*csintb); //Μετατροπή καρτεσιανής συντεταγμένης α σε πολική r = √ (x + y) psintb=atan(-2.70)*180/pi;//Μετατροπή καρτεσιανής συντεταγμένης β σε πολική θ = tan-1 ( y / x ) printf ("The values of the polar coordinates are (%.10lf,%.10lf",psinta,psintb); Στην ουσία με βάση τα παραπάνω όταν βάζω τις τιμές -3 και 10 το αποτέλεσμα που μου γυρνάει θα έπρεπε να είναι 10.4403065089 και 106.6992441502 (οταν προσθέτω στο psintb και 180 μοιρες) αντίθετα εγώ με τον παραπάνω κώδικα παίρνω 10.4403065089 και 107,034559513 (αφού προστεθούν και οι 180 μοιρες) Κάπου στην δεύτερη συντεταγμένη υπάρχει κάποιο θέμα ακρίβειας που δε μπορώ να το εντοπίσω και κάτι γίνεται λάθος. Το pi το δηλώνω 3.14159265 Αν έχει κάποιος καμία ιδεά. Ευχαριστώ
CtrlFreak Δημοσ. 25 Οκτωβρίου 2015 Δημοσ. 25 Οκτωβρίου 2015 (επεξεργασμένο) Για δες εδώ https://ideone.com/9oCH6W εμένα μου δίνει έξοδο The values of the polar coordinates are (10.4403065089,110.3231368297 Το λάθος είναι στην γραμμή psintb=atan(-2.70)*180/pi;//Μετατροπή καρτεσιανής συντεταγμένης β σε πολική θ = tan-1 ( y / x ) και είναι αρκετά απλό. Επεξ/σία 25 Οκτωβρίου 2015 από CtrlFreak
Leite33 Δημοσ. 25 Οκτωβρίου 2015 Μέλος Δημοσ. 25 Οκτωβρίου 2015 Καλησπέρα. Ευχαριστώ για την αμεση απάντηση. Αλλά εξακολουθω να μην παίρνω σωστό αποτέλεσμα . Έχεις δίκιο για το λάθος που έκανα και έβαλα -2,70 το έβαλα για να δω που βγαίνει σωστά. Το δικό σου δε βγάζει πάλι σωστά αποτελέσματα. Τι θέλω να πω. Χρησιμοποιώντας την παρακάτω σελίδα http://www.rapidtables.com/calc/math/Arctan_Calculator.htm Το αποτέλεσμα βάζοντας -3/10 μέσα στον υπολογισμό και προσθέτοντας 180 μοιρες βγαίνει σωστό αντίθετα εμένα μου βγαίνει 103,239628 και δε μπορώ να καταλάβω γιατί. Επίσης πως έβγαλες 108.4349488229 όταν με την παραπάνω σελίδα παίρνεις 106,69924439. Η κάνω κάτι λάθος στη σειρά των πράξεων η με δουλεύει ο compiler. Χρησιμοποιώ code blocks. Μια άλλη σκέψη είναι να άλλαξω τις μεταβλητές μήπως με το double γινονται στρογυλλοποιήσεις και για αυτό δε βγαίνει ακριβώς
Leite33 Δημοσ. 25 Οκτωβρίου 2015 Μέλος Δημοσ. 25 Οκτωβρίου 2015 Mέσα στην παρένθεση βάζω 10/-3 δηλαδή τις δύο συντεταγμένες που δίνω csintb/csinta
denisbarko Δημοσ. 26 Οκτωβρίου 2015 Δημοσ. 26 Οκτωβρίου 2015 (επεξεργασμένο) The C library function double atan(double x) returns the arc tangent of x in radians source Το λάθος σου είναι ότι παίρνεις αποτέλεσμα σε ακτίνια, του βάζεις τις 180ο και βλέπεις ότι να'ναι. Την γωνία θ πρέπει να την μετατρέψεις από ακτίνια σε μοίρες, και στη συνέχεια να προσθέσεις τις 180ο. #include <stdio.h> #include <math.h> #define pi 3.1415926535897932384626433 int main() { double r , theta , cart_x , cart_y; printf("\nEnter the values of the cartesian coordinates:\n"); scanf("%lf%lf",&cart_x,&cart_y); r = hypot(cart_x,cart_y); //αν δεν θες την συνάρτηση της υποτείνουσας, κα'ντο manually theta = atan(cart_y/cart_x)*180/pi; printf("\nThe values of the polar coordinates are [%.10lf , %.10lf]" ,r ,theta+180); return 0; } Ιδού: Επεξ/σία 26 Οκτωβρίου 2015 από denisbarko
Leite33 Δημοσ. 7 Νοεμβρίου 2015 Μέλος Δημοσ. 7 Νοεμβρίου 2015 Καλησπέρα. Ευχαριστώ για την απάντηση λύθηκε το θέμα μου και συγνώμη για την καθυστέρηση είχα ένα μικρό λάθος στις παρενθέσεις. Τώρα τις τιμές που προέκυψαν προσπαθώ να τις ξανακάνω καρτεσιανές συντεταγμένες ως εξής: csinta=psinta*cos(psintb*pi/180); csintb=psinta*sin(psintb*pi/180); όπου psinta και psintb είναι οι πολικές συντεταγμένες που προέκυψαν και csinta και csintb είναι οι καινούριες καρτεσιανές που θα προκύψουν. Δηλαδή αρχικά βάζω -3 και 10 στη συνέχεια προκύπτει σωστά το 10.4403065089 και 106.6992441502 με ξανά μετατροπή όπως παραπάνω προκύπτει -3.000000000 και 10.00000000 αντί για -2.9999999641 και 10.0000000108 και δε μπορώ να βρώ το λάθος. Στην ουσία μου κάνει στρογγυλοποίηση και δε το θέλω αυτό.
Leite33 Δημοσ. 8 Νοεμβρίου 2015 Μέλος Δημοσ. 8 Νοεμβρίου 2015 Σε ευχαριστώ για το ενδιαφέρον ετσι: csinta2=psinta*cos(psintb*pi/180); csintb2=psinta*sin(psintb*pi/180); printf ("\nThe values of the new cartesian coirdinates are (%.10lf,%.10lf)",csinta2,csintb2);
παπι Δημοσ. 8 Νοεμβρίου 2015 Δημοσ. 8 Νοεμβρίου 2015 Απο που και ως που πρεπει να σου βγαλει αλλα νουμερα; το 1/3 σου βγαζει 0.3333οτιναια το (1/3) * 3 θα σου βγαλει 1, δεν γινεται να σου βγαλει κατι αλλο επειδη αλγεβρικα το f(x) = x/3 * 3 <=> f(x) = x υγ: Βαζε καλυτερα ονοματα. Το ενα ειναι γωνια το αλλο μεγεθος
Leite33 Δημοσ. 8 Νοεμβρίου 2015 Μέλος Δημοσ. 8 Νοεμβρίου 2015 To σωστό αποτέλεσμα είναι αυτό: -3.000000000 και 10.00000000 αντί για -2.9999999641 και 10.0000000108 και δε μπορώ να βρώ το λάθος. Στην ουσία μου κάνει στρογγυλοποίηση και δε το θέλω αυτό. Αφού στη συνέχεια πρέπει να βρώ και το λάθος που είναι η διαφορά τους δηλαδή -3-(-2.9999999641). Τη διαφορά από τις αρχικές καρτεσιανές συντεταγμένες με τις νέες συντεταγμένες που ξαναυπολογίστικαν. αν είναι σωστά ότι έχω κάνει τότε έχω 0 error αφου -3-(-3.0000000000)=0 κάτι που δεν ισχύει όμως αφου σκοπός είναι να δείξουμε αυτό το ελάχιστό σφάλμα
Leite33 Δημοσ. 8 Νοεμβρίου 2015 Μέλος Δημοσ. 8 Νοεμβρίου 2015 Καλησπέρα Έχω γραψει το παρακάτω πρόγραμμα: #include <stdio.h> #include <stdlib.h> #include <math.h> #define pi 3.1415926535897932384626433 int main() { double csinta, csintb; double psinta, psintb; double csinta2, csintb2; double error1, error2; printf("\n\nEnter the values of the cartesian coordinates\n"); scanf("%lf %lf", &csinta, &csintb); //Εισαγωγή δύο συντεταγμένων από το χρήστη psinta=sqrt(csinta*csinta+csintb*csintb); psintb=atan(csintb/(csinta))*180/pi; printf ("The values of the polar coordinates are (%.10lf,%.10lf)",psinta,(psintb+180)); csinta2=psinta*cos(psintb*pi/180); csintb2=psinta*sin(psintb*pi/180); printf ("\nThe values of the new cartesian coirdinates are (%.12lf,%.12lf)",csinta2,csintb2); error1=(csinta-csinta2); error2=(csintb-csintb2); printf ("\nError (%.10lf,%.10lf)",error1,error2); return 0; } Λοιπόν με βάση τα παραπάνω θα έπρεπε δίνοντας τους αριθμούς -3 10 να παίρνω σαν αποτέλεσμα: 10.4403065089, 106.6992441502 -2.9999999999, 10.00000000108 Error -0.0000000359,-0.0000000108 Εγώ παίρνω 10.4403065089, 106.6992441502 -3.00000000000,10.00000000000 0.000000000000,0.0000000000 Στην ουσία στα δεύτερα αποτελέσματα μου κάνει στρογγυλοποίηση προς τα πάνω και προς το κάτω και δε το θέλω αυτο.
CtrlFreak Δημοσ. 8 Νοεμβρίου 2015 Δημοσ. 8 Νοεμβρίου 2015 Καλησπέρα Έχω γραψει το παρακάτω πρόγραμμα: csinta2= (float) psinta*cos(psintb*pi/180); csintb2= (float) psinta*sin(psintb*pi/180); printf ("\nThe values of the new cartesian coirdinates are (%.12lf,%.12lf)",csinta2,csintb2); Δοκίμασε να προσθέσεις ένα float όπως το πάνω.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα