Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα

Θα ήθελα λίγο τα φώτο σας σε 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

Αν έχει κάποιος καμία ιδεά. Ευχαριστώ

Δημοσ. (επεξεργασμένο)

Για δες εδώ 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 )

και είναι αρκετά απλό. 

Επεξ/σία από CtrlFreak
Δημοσ.

Καλησπέρα.

Ευχαριστώ για την αμεση απάντηση. Αλλά εξακολουθω να μην παίρνω σωστό αποτέλεσμα . Έχεις δίκιο για το λάθος που έκανα και έβαλα -2,70 το έβαλα για να δω που βγαίνει σωστά. Το δικό σου δε βγάζει πάλι σωστά αποτελέσματα. Τι θέλω να πω.

Χρησιμοποιώντας την παρακάτω σελίδα

http://www.rapidtables.com/calc/math/Arctan_Calculator.htm

Το αποτέλεσμα βάζοντας -3/10 μέσα στον υπολογισμό και προσθέτοντας 180 μοιρες βγαίνει σωστό αντίθετα εμένα μου βγαίνει

103,239628 και δε μπορώ να καταλάβω γιατί. Επίσης πως έβγαλες 108.4349488229 όταν με την παραπάνω σελίδα παίρνεις

106,69924439. Η κάνω κάτι λάθος στη σειρά των πράξεων η με δουλεύει ο compiler. Χρησιμοποιώ code blocks. Μια άλλη σκέψη είναι να άλλαξω τις μεταβλητές μήπως με το double γινονται στρογυλλοποιήσεις και για αυτό δε βγαίνει ακριβώς

Δημοσ. (επεξεργασμένο)

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;
}

Ιδού:

 

eIjkwGq.png

 

Επεξ/σία από denisbarko
  • 2 εβδομάδες αργότερα...
Δημοσ.

Καλησπέρα.

Ευχαριστώ για την απάντηση λύθηκε το θέμα μου και συγνώμη για την καθυστέρηση είχα ένα μικρό λάθος στις παρενθέσεις. Τώρα τις τιμές που προέκυψαν προσπαθώ να τις ξανακάνω καρτεσιανές συντεταγμένες ως εξής:

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 και δε μπορώ να βρώ το λάθος. Στην ουσία μου κάνει στρογγυλοποίηση και δε το θέλω αυτό.

Δημοσ.

Σε ευχαριστώ για το ενδιαφέρον ετσι:

    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);
Δημοσ.

Απο που και ως που πρεπει να σου βγαλει αλλα νουμερα; 

το 1/3  σου βγαζει 0.3333οτιναια

το (1/3) * 3 θα σου βγαλει 1, δεν γινεται να σου βγαλει κατι αλλο επειδη αλγεβρικα το f(x) = x/3 * 3 <=> f(x) = x

 

υγ: Βαζε καλυτερα ονοματα. Το ενα ειναι γωνια το αλλο μεγεθος

Δημοσ.

To σωστό αποτέλεσμα είναι αυτό:

-3.000000000 και 10.00000000 αντί για -2.9999999641 και 10.0000000108 και δε μπορώ να βρώ το λάθος. Στην ουσία μου κάνει στρογγυλοποίηση και δε το θέλω αυτό. Αφού στη συνέχεια πρέπει να βρώ και το λάθος που είναι η διαφορά τους δηλαδή -3-(-2.9999999641). Τη διαφορά από τις αρχικές καρτεσιανές συντεταγμένες με τις νέες συντεταγμένες που ξαναυπολογίστικαν. αν είναι σωστά ότι έχω κάνει τότε έχω 0 error αφου -3-(-3.0000000000)=0 κάτι που δεν ισχύει όμως αφου σκοπός είναι να δείξουμε αυτό το ελάχιστό σφάλμα

Δημοσ.

Καλησπέρα

Έχω γραψει το παρακάτω πρόγραμμα:

#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

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

Δημοσ.

Καλησπέρα

Έχω γραψει το παρακάτω πρόγραμμα:

    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 όπως το πάνω.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...