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

Αποτελέσματα συναρτήσεων


johnykim

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

Δημοσ.

Καλησπέρα σε όλους.:-)

 

έχω ένα θεματάκι με αποτελέσματα κάποιων πράξεων.

 

>#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define P 3.14

main()
{
float x,y;
int am=0;

printf("Dwse timh tou x gia ypologismo tou y\n");
printf("\nOi times tou x tha prepei na einai apo -23.45 ews 52.00\n");
printf("\n                             X              Y        \n");


 
while(am<30000)
{
am++;      
        
scanf("%f",&x);

if(x>-23.45 && x<=-12.33)
{
   y=3*sin(x/12);  
   printf("\n                            %0.2f           %0.2f\n",x,y);
  
}
else if (x>-12.33 && x<=-1.63)
{
 
    y=6*cos(3*x/P);
    printf("\n                           %0.2f           %0.2f\n",x,y);
}
else if (x>-1.63 && x<=6.38)
{
    y=(3*pow(x,2))+ (7*x) -12.5;    
    printf("\n                           %0.2f           %0.2f\n",x,y);
}
else if (x>6.38 && x<=12.53)
{
 
    y=(3*x)/((2.3+x)*(pow(x,4)+1.5));  
    printf("\n                           %0.2f           %0.2f\n",x,y);     
}
else if (x>12.53 && x<=52.00)
{
    y=3.5*log(x/32);
    printf("\n                           %0.2f           %0.2f\n",x,y);
}
else
printf("\nLathos timh tou x\n");


}//while 



system("PAUSE");	
return 0;
}

 

Όπως βλέπετε έχω κάποια αποτελέσματα y ,ανάλογα με την τιμή χ.Δεν μπορώ να βρω που είναι το λάθος ,και σε κάποια αποτελέσματα το y είναι 0.. Για παράδειγμα όταν το χ είναι 6 ή 7 ή 8 ή 9..

 

Τα αποτελέσματα του Y, αντίστοιχα ,που πρέπει να φτιάξω είναι αυτά :

 

Υ = 3ημ(χ/12)

Υ = 6συν(3χ/π)

Υ = 3 επί χ στο τετράγωνο + 7χ –12,5

Υ = 3χ/[(2,3+χ)(χ στην τετάρτη+1,5)]

Υ = 3,5λογ(χ/32)

Δημοσ.

αντι για 0.2f βαλε σκετο .2f και κανε ενα compile+run και πες τι σου εμφανιζει

 

edited: επισης σε καθε συναρτηση της y δωστην ως float ... πχ : y=(float)3*sin(x/12);

 

re-edited: checkara τον κωδικα σου και τον ετρεξα με την τιμη x=7 .... το προβλημα βρισκεται εδω

>else if (x>6.38 && x<=12.53)
{
 
    y=(3*x)/((2.3+x)*(pow(x,4)+1.5));  
    printf("\n                           %0.2f           %0.2f\n",x,y);     
}

αμα κανεις τις πραξεις στο calculator θα δεις οτι τα 2 πρωτα δεκαδικα ψηφια ειναι μηδεν και για αυτον τον λογο σου βγαινει 0. Για να σου λυθει το προβλημα υπαρχουν 2 τροποι:

a) το κανεις σαν %.8f ή

B)%e , που σημαινει πραγματικός κινητής υποδιαστολής.

 

>
else if (x>6.38 && x<=12.53)
{
 
    y=(float)(3*x)/((2.3+x)*(pow(x,4)+1.5));  
    printf("\n                           %.2f           %e\n",x,y);     
}

 

καλο επισης θα ηταν το y να το δηλωσεις σαν double και οχι σαν float για μεγαλυτερη ευκρινια αποτελεσματων. Λογικα τωρα πρεπει να δουλευει :)

Δημοσ.

@johnykim

 

Λοιπόν, δες τι γίνεται.

Τα αποτελέσματα υπολογίζονται σωστά, απλώς δεν τα βλέπεις.

Όταν τα τυπώνεις χρησιμοποιείς ανεπαρκές πλήθος ψηφίων με αποτέλεσμα να εκτυπώνονται στογγυλευμένα στον πλησιέστερο αριθμό για να χωρέσουν.

Π.χ. αν προκύπτει .0008 και το τυπώσεις με δύο δεκαδικά, θα δείξει 0 διότι θα χρησιμοποιήσει μόνον τα δύο πρώτα.

Στις printf αντί 0.2f θέσε 12.8f για να υπάρχει επαρκές περιθώριο.

 

 

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

Π.χ. μην γράφεις y=6*cos(3*x/P); αλλά y=6.0f*cos(3.0f*x/P);

 

Τέλος, επειδή το 1 είναι η εφαπτομένη του π/4, το π μπορεί να υπολογιστεί ως pi = 4.*atan(1.) οπότε η ακρίβεια είναι η μέγιστη δυνατή.

Άντε, πες μας αν τα κατάφερες....

Δημοσ.

@Mp0u, τα ίδια μου εμφανίζει.:o

 

@V.I.Smirnov , θέλω όμως το αποτέλεσμα να είναι σε δύο δεκαδικά.:P

 

 

Παιδιά εντάξει, αυτό που με ενδιαφέρει είναι να εμφανίζει σωστά τα y.Μην είχα δηλαδή κάποιο λάθος στον τρόπο λύσης της y.Τώρα με τα δεκαδικά, αφού πρέπει να έχω δύο, δεν νομίζω ότι μπορώ να κάνω κάτι στην περίπτωση μικρών αριθμών.

 

Σας ευχαριστώ :-)

Δημοσ.

τα 2 πρωτα δεκαδικα ψηφια στο διαστημα 6.38 μεχρι 12.53 ειναι παντα 0. Ο μονος τροπος για να εμφανισεις ενα αποτελεσμα ειναι το y να το δωσεις ως y.kati * 10^-4 ....

αν με καταλαβαινεις...

 

παντως και οι 2 λυσεις που σου δωσαμε δουλευουν :D

Δημοσ.

Δεν μπορεί να τυπωθεί με δυο δεκαδικά εφόσον είναι μικρότερο.

 

Ο μόνος τρόπος είναι να γραφεί σε εκθετική μορφή.

Π.χ. το .00087654 να τυπωθεί ως 8.76Ε-4.

Δημοσ.

Ο μόνος τρόπος είναι να γραφεί σε εκθετική μορφή.

Π.χ. το .00087654 να τυπωθεί ως 8.76Ε-4.

 

αυτο εννοουσα και γινεται με το %e αλλα βγαινει καπως μακριναρι....

Δημοσ.

Με φλομώσατε στα edit , τα οποία δεν είχα δει.:P

 

Όλα εντάξει παιδιά! Σας ευxαριστώ :-)

Δημοσ.

Ε, αν γράψει π.χ. 6.2f το .00087654 τυπώνεται ως 8.76Ε-4.

 

Αυτό που δεν έχει η C++ (ή δεν ξέρω πώς γίνεται) είναι να μπορείς να κάνεις scaling τον αριθμό κατά την εκτύπωσή του

μετακινώντας την υποδιαστολή όσες θέσεις θέλεις δεξιά ή αριστερά (και ο εκθέτης της δύναμης να ρυθμίζεται αυτόματα).

 

Π.χ. το .00087654 εγώ μπορεί να θέλω να τυπώνεται σε εκθετική μορφή ως 87.654Ε-5.

Στη fortran εξ ορισμού η εκθετική γραφή θέτει το πρώτο ψηφίο μετά την υποδιαστολή, δηλ. σε εκθετική μορφή το γράφει 0.87654Ε-3.

Αλλά επιπλέον, η υποδιαστολή μπορεί να μετακινηθεί κατά βούληση και να γραφεί ως 87.654Ε-5 . Αυτό θα γινόταν πχ. με την μορφοποίηση (2p,e12.3) .

 

Αντίστοιχα στην C++, εξ ορισμού η εκθετική γραφή θέτει το πρώτο ψηφίο πριν την υποδιαστολή δηλ. το τυπώνει ως 8.765Ε-4 ή 8.7654Ε-4 .

Αλλά μόνον αυτό, δυστυχώς, δηλ. η υποδιαστολή είναι πάντα μετά το πρώτο ψηφίο χωρίς δυνατότητα μετακίνησης.

Όποιος ξέρει αν και πώς γίνεται (αυτόματα μέσω της printf ή της cout) ας μας το πει...

Δημοσ.

>
if(x>-23.45 && x<=-12.33)

 

 

Αυτοί οι έλεγχοι είναι λίγο επικίνδυνοι. Να τους προσέχεις και γενικά να τους αποφεύγεις όσο μπορείς, τουλάχιστον σε αυτή τη μορφή. Μιλάω γενικά και όχι για το συγκεκριμένο πρόγραμμα.

Αρχειοθετημένο

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

  • Δημιουργία νέου...