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

υπολογισμός σε c.. τι κάνω λάθος


karabouzouk...

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

Δημοσ.

>#include<stdio.h>
#define foros 0.33439
void main() {

float timi,timpolkaiforos,timitelxwrisforos,litra,epforou;

printf("\n\nDwse timh polishs... --> ");
scanf("%f", &timi);
printf("Dwseposothta se litra.. -->");
scanf("%f", &litra);
timpolkaiforos=(timi+foros)*litra;
epforou=foros*litra;
timitelxwrisforos=timpolkaiforos-epforou;
printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos);
system("pause");
} 

 

Το κάνω compile με turbo c 3 και δεν έχω σφάλματα...

αλλά διαπίστωσα ότι στους δύο πολλαπλασιασμούς κάνει κάποιο λάθος...

με απλές πράξεις που δοκίμασα μετα τον πολλαπλασιασμό εχει κατά 0.000015 λαθος το αποτέλεσμα η κατι τέτοιο...

ας το δοκιμάσει κάποιος με έναν λιγότερο αρχαίο compiler να δώ τι φταίει..!

Ευχαριστώ..!

  • Απαντ. 37
  • Δημ.
  • Τελ. απάντηση
Δημοσ.
>#include<stdio.h>
#define foros 0.33439
[b][color="Red"][size="4"][size="5"]void main() [/size][/size][/color][/b]{

float timi,timpolkaiforos,timitelxwrisforos,litra,epforou;

printf("\n\nDwse timh polishs... --> ");
scanf("%f", &timi);
printf("Dwseposothta se litra.. -->");
scanf("%f", &litra);
timpolkaiforos=(timi+foros)*litra;
epforou=foros*litra;
timitelxwrisforos=timpolkaiforos-epforou;
printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos);
system("pause");
} 

 

Το κάνω compile με turbo c 3 και δεν έχω σφάλματα...

αλλά διαπίστωσα ότι στους δύο πολλαπλασιασμούς κάνει κάποιο λάθος...

με απλές πράξεις που δοκίμασα μετα τον πολλαπλασιασμό εχει κατά 0.000015 λαθος το αποτέλεσμα η κατι τέτοιο...

ας το δοκιμάσει κάποιος με έναν λιγότερο αρχαίο compiler να δώ τι φταίει..!

Ευχαριστώ..!

 

η συναρτηση main δεν επιστρεφει void αλλα int. αν το προγραμμα τερματισει επιτυχως επιστρεφει 0 αλλιως 1

 

οποτε στη γραμμη με το κοκκινο γραψε int main(void) και εισαι ok

 

ακομα αν θες μεγαλυτερη ακριβεια αντι για float ορισε τις μεταβλητες σου double

Δημοσ.
Το κάνω compile με turbo c 3 και δεν έχω σφάλματα...

αλλά διαπίστωσα ότι στους δύο πολλαπλασιασμούς κάνει κάποιο λάθος...

με απλές πράξεις που δοκίμασα μετα τον πολλαπλασιασμό εχει κατά 0.000015 λαθος το αποτέλεσμα η κατι τέτοιο...

ας το δοκιμάσει κάποιος με έναν λιγότερο αρχαίο compiler να δώ τι φταίει..!

Ευχαριστώ..!

 

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

Δημοσ.

Δεν νομίζω ότι η main επιστρέφει κάποια τιμή όπως και να την έχω δηλώσει από τη στιγμή που δεν έχω βάλει πουθενά return και πόσο μάλλον τώρα που την έχω δηλώσει και void (που σημαίνει ότι δεν επιστρέφει τίποτα)... Βασικά δεν νομίζω ότι έχει να κάνει με το λάθος αυτο που παρατηρώ στις πράξεις... και δεν μπορώ να φανταστώ τι μπορεί να φταίει...

Πχ όταν βάζω για την πρώτη μεταβλητή 2 και τη δευτερη 500 αντι να πάρω 1000 που είναι το σωστό βγάζει 999,99937 ή κάτι τέτοιο...

Δημοσ.
Δεν νομίζω ότι η main επιστρέφει κάποια τιμή όπως και να την έχω δηλώσει από τη στιγμή που δεν έχω βάλει πουθενά return και πόσο μάλλον τώρα που την έχω δηλώσει και void (που σημαίνει ότι δεν επιστρέφει τίποτα)... Βασικά δεν νομίζω ότι έχει να κάνει με το λάθος αυτο που παρατηρώ στις πράξεις... και δεν μπορώ να φανταστώ τι μπορεί να φταίει...

Πχ όταν βάζω για την πρώτη μεταβλητή 2 και τη δευτερη 500 αντι να πάρω 1000 που είναι το σωστό βγάζει 999,99937 ή κάτι τέτοιο...

 

παντως η main σε καμια περιπτωση δεν μπορει να δηλωθει void γιατι πολυ απλα ο compiler φωναζει....

 

τωρα οσον αφορα αυτο που λες δοκιμασε αντι για float να βαλεις double

Δημοσ.

Η απόκλιση οφείλεται σε 2 παράγοντες:

 

1. Κάθε φορά που γίνονται πράξεις κινητής υποδιαστολής, πιθανόν να υπεισέλθει σφάλμα-απόκλιση λόγω του τρόπου με τον οποίο αναπαρίστανται οι πραγματικοί αριθμοί στον υπολογιστή (πεπερασμένη ακρίβεια)

2. Ενώ μπορείς να υπολογίσεις την τιμή της μεταβλητής timitelxwrisforos απευθείας με έναν πολλαπλασιασμό (timi * litra;), εσύ την υπολογίζεις με περισσότερες από μία πράξεις που εμπλέκουν πραγματικούς αριθμούς. Λόγω και του 1 --> μεγαλύτερη πιθανότητα να εισάγεις σφάλμα -απόκλιση

 

 

Ο παρακάτω κώδικας :

 

>#include <stdio.h>
#include <stdlib.h>

int main() {
const float foros = 0.33439;
float timi, timpolkaiforos, timitelxwrisforos, litra, epforou;

printf("\n\nDwse timh polishs --> ");
scanf("%f", &timi);
printf("Dwse posothta se litra --> ");
scanf("%f", &litra);

epforou = foros * litra;
timitelxwrisforos = timi * litra;
timpolkaiforos = timitelxwrisforos + epforou;

printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos);

/* system("pause"); */
return EXIT_SUCCESS;
}

 

γίνεται compile σε gcc 4.3.2 χωρίς σφάλματα ή warnings :

 

>parsifal@vm-intrepid:/tmp$ gcc -Wall -o test test.c
parsifal@vm-intrepid:/tmp$

 

...και για τις ενδεικτικές τιμές εισόδου που ανέφερες (timi = 2 και litra = 500) δίνει αποτέλεσμα 1000 :

 

>parsifal@vm-intrepid:/tmp$ ./test


Dwse timh polishs --> 2
Dwse posothta se litra --> 500


Telikh timh --> 1000.000000

parsifal@vm-intrepid:/tmp$

 

 

Ελπίζω να βοήθησα...

Δημοσ.

Βασικά το void δεν είναι αυτό που προκαλεί το πρόβλημα... και στο κάτω κάτω το προγραμμά τηα κάνει compile me warning. Α, και κάτι άλλο.. γιατί να γράψεις 'int main' και όχι σκετο 'main' ?

Δημοσ.

Δεν με ενδιαφέρει μόνο το τελικό αποτέλεσμα αλλά και τα ενδιάμεσα άλλο που εδώ όπως το έγραψα δεν τα εμφανίζω κάπου..

Για τη main δεν βάζω το χέρι μου στη φωτιά αλλά νομίζω ότι μπορεί να δηλωθεί και σαν void που όπως και να έχει αποκλείεται να δημιουργεί αυτό το πρόβλημα...

Αν δοκιμάσεις να κάνεις τις πράξεις με το χέρι θα δεις ότι δεν χρειάζεται παραπάνω από 5 δεκαδικά και έτσι δεν παίζει να φταίει αυτό.. και το κουλό που δοκίμασα για να σιγουρευθώ έκανα 0*1000 και πάλι έβγαλε 0,0000015...πάντως όχι 0....

Δημοσ.

Δοκίμασε να περιορίσεις τα ψηφία μετά την κινητή υποδιαστολή. Έτσι άλλαξε το %f της τελικής τιμής ( printf("\n\nTelikh timh --> %f\n\n", timitelxwrisforos);) σε %.2f ώστε να έχεις ακρίβεια 2 ψηφίων (στρογγυλοποίηση) οπότε 2 * 500 = 1000,00 διαφορετικά αν %f = 999.999939 ;).

 

Όσον αφορά το 0*1000 στον Compiler μου (C++ Builder) επιστρέφει φυσικά 0.

 

Τέλος ρίξε μια ματιά στο κλασσικό πια What Every Computer Scientist Should Know About Floating-Point Arithmetic: http://docs.sun.com/source/806-3568/ncg_goldberg.html

 

Καλή τύχη!

:)

Δημοσ.
Δεν νομίζω ότι η main επιστρέφει κάποια τιμή όπως και να την έχω δηλώσει από τη στιγμή που δεν έχω βάλει πουθενά return και πόσο μάλλον τώρα που την έχω δηλώσει και void (που σημαίνει ότι δεν επιστρέφει τίποτα)... Βασικά δεν νομίζω ότι έχει να κάνει με το λάθος αυτο που παρατηρώ στις πράξεις... και δεν μπορώ να φανταστώ τι μπορεί να φταίει...

Πχ όταν βάζω για την πρώτη μεταβλητή 2 και τη δευτερη 500 αντι να πάρω 1000 που είναι το σωστό βγάζει 999,99937 ή κάτι τέτοιο...

 

ναι το void δεν εχει να κανει με τις πραξεις που λες αλλα να ξερεις οτι παντα μα παντα η main επιστρεφει κατι και ειναι παντα int ειτε του εχεις βαλει return ειτε οχι.

Δημοσ.

Να κάνω και εγώ μια ερώτηση ρε παιδιά; Ποστάρω εδώ για να μην ανοίγω άλλο thread άσκοπα, και το ερώτημά μου έχει να κάνει πάλι με floating point calculations.

 

Λοιπόν, έχω γράψει το παρακάτω προγραμματάκι

>#include <stdio.h>
#include <math.h>

float calc(float n1, float n2);

int main(void)
{
float num1, num2, result;

printf("Enter two floating point numbers (q to quit): ");
while (scanf("%f %f", &num1, &num2) == 2)
{	
	result = calc(num1,num2);
	printf("\nThe result is %f \n", result);
	printf("Enter two floating point numbers (q to quit): ");
	result = 0;
}
return 0;
}

float calc(float n1, float n2)
{	
return (fabs(n1-n2)/(n1*n2)); //επιστρέφει το πηλίκο της απόλυτης τιμή της διαφοράς των δύο αριθμών με το γινόμενο τους
}

 

Γιατί αν δηλώσω τις μεταβλητές ως double αλλά και το return type της συνάρτησης ως double, δίνει άκυρα αποτελέσματα του στυλ:

>
Enter two floating point numbers (q to quit): 2 1
The result is 11298...565.000000

(μην κάνετε σχόλια γιατί έχω βάλει την πράξη σε function, άσκηση είναι...)

 

Εάν τις κάνω float, no problem :/

Δημοσ.
ναι το void δεν εχει να κανει με τις πραξεις που λες αλλα να ξερεις οτι παντα μα παντα η main επιστρεφει κατι και ειναι παντα int ειτε του εχεις βαλει return ειτε οχι.

 

Η main() είναι μια συνάρτηση όπως όλες οι άλλες με τη μόνη διαφορά ότι είναι η μόνη απαραίτητη για να "υπάρξει" ένα πρόγραμμα στη C...

Άρα αυτό σημαίνει ότι όπως κάθε άλλη συνάρτηση μπορείς να την δηλώσεις ό,τι τύπο δεδομένων θέλεις (ανάλογα με το τι χρειάζεσαι) έτσι και τη main() ανάλογα με το τί θα την δηλώσεις πρέπει να επιστρέψεις και τον ανάλογο τύπο δεδομένων......

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

Μια σελίδα που βρήκα γι αυτό το θέμα http://users.aber.ac.uk/auj/voidmain.shtml

λέει ότι ο ορισμός της main() σαν void προκαλεί και άλλα προβλήματα κάτω από ορισμένες συνθήκες όπως crash-αρισμα της εφαρμογής και όπως είπες καλό είναι να βαζουμε ένα return 0 στο τέλος μιας int main()...

 

Τέσπα αυτά είναι λίγο offtopic αλλά ίσως χρήσιμα ως γνώσεις..

Δημοσ.

>#include<stdio.h>
int main () {
   float y=500,x=0.33439, p;
   
   p=x*y;
   printf("\n\n...... %f\n\n", p);
   return 0;
}

 

Ακόμη κανείς δεν βρήκε τίποτα γι αυτό το θέμα....??

Τρέχοντας απλά το παραπάνω προγραμματάκι που κάνει έναν πολλαπλασιασμό μου βγάζει αποτέλεσμα 167,195007 ενώ το κανονικό αποτέλεσμα είναι 167,195...

Σε εσάς γίνεται έτσι η βγάζει το κανονικό αποτέλεσμα...?

Καμιά πρόταση.. καμιά εξήγηση...?

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

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

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