jsmith6 Δημοσ. 10 Απριλίου 2007 Δημοσ. 10 Απριλίου 2007 Γιατί η C δεν επιτρέπει την ακόλουθη πράξη; >#include <stdio.h> #include <math.h> int main(void) { float n; n = 18 % pow(3,2); printf("n: %f\n", n); return 0; } Μπορώ να κάνω τις δύο πράξεις διαδοχικά, αλλά θα ήταν πολύ βολικό να μπορώ να τις κάνω σε μία γραμμή. Ο compiler που χρησιμοποιώ: >gcc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)
Legionnaire Δημοσ. 10 Απριλίου 2007 Δημοσ. 10 Απριλίου 2007 Η pow() ενδέχεται να επιστρέψει μηδέν και δεν ορίζεται υπόλοιπο της διαίρεσης με το μηδέν. Για αυτό ο compiler γκρινιάζει. Μια συμβουλή: να αποφεύγεις τις "γρήγορες" πράξεις της μιας γραμμής όταν παρεμβάλονται returned values από functions. Θα πρέπει να ελέγχεις το αποτέλεσμα που σου επιστρέφουν. Έτσι θα γράφεις πιο σωστά προγράμματα και θα αποφεύγεις bugs.
chiossif Δημοσ. 10 Απριλίου 2007 Δημοσ. 10 Απριλίου 2007 Η pow έχει πρωτότυπο: double pow(double x, double y); άρα επιστρέφει πραγματικό αριθμό διπλής ακρίβειας. Τώρα ο τελεστής % κατά K&R είναι τελεστής υπολοίπου ακέραιας διαίρεσης και ΔΕΝ εφαρμόζεται σε αριθμούς κινητής υποδιαστολής (K&R Κεφ. 2.5). Προτείνω αν η pow που θέλεις ΕΧΕΙ ΠΑΝΤΑ ακέραιο αποτέλεσμα να γράψεις μια δική σου έστω your_pow (βλέπε και K&R παρ. 1.7 για κάτι έτοιμο) και δούλεψε με αυτήν. Έτσι ούτε ο μεταγλωτιστής θα γκρινιάζει ούτε εσύ θα γράφεις πολλές γραμμές. Χριστός Ανέστη! Χρόνια Πολλά σε όλους.
jsmith6 Δημοσ. 11 Απριλίου 2007 Μέλος Δημοσ. 11 Απριλίου 2007 Μια συμβουλή: να αποφεύγεις τις "γρήγορες" πράξεις της μιας γραμμής όταν παρεμβάλονται returned values από functions. Θα πρέπει να ελέγχεις το αποτέλεσμα που σου επιστρέφουν. Έτσι θα γράφεις πιο σωστά προγράμματα και θα αποφεύγεις bugs. Αυτή είναι μια καλή συμβουλή, αλλά οι τιμές που παίρνουν οι μεταβλητές μέσα στις functions είναι πάντα θετικοί και μεγαλύτεροι του μηδενός. Για αυτό φροντίζω να κάνω ελέγχους κατά το user input. Όμως καταλαβαίνω το ρίσκο που ενέχεται από την τακτική των γρήγορων πράξεων. Η pow έχει πρωτότυπο: double pow(double x' date=' double y); άρα επιστρέφει πραγματικό αριθμό διπλής ακρίβειας.[/quote'] Ναί, μου φάνηκε παράξενο που το ακόλουθο πρόγραμμα μπορούσε να γίνει compile: >#include <stdio.h> #include <math.h> int main(void) { float result=0; result = 19 / pow(3,2); printf("%f", result); return 0; } Μετά κατάλαβα οτι μάλλον θα είναι πως η διάιρεση υπολύπου πρέπει να γίνει ανάμεσα σε 2 integer. Προτείνω αν η pow που θέλεις ΕΧΕΙ ΠΑΝΤΑ ακέραιο αποτέλεσμα να γράψεις μια δική σου έστω your_pow (βλέπε και K&R παρ. 1.7 για κάτι έτοιμο) και δούλεψε με αυτήν. Έλυσα το πρόβλημα πιο απλά, προσέθεσα ένα "(int)" μπροστά απο το pow(). Δηλαδή έγινε έτσι: > #include <stdio.h> #include <math.h> int main(void) { float result=0; result = 19 % (int)pow(3,2); printf("%f", result); return 0; } Τώρα το πρόβλημά μου είναι πως ο GCC δεν κάνει compile το ακόλουθο, ενώ ένας πανάρχαιος compiler της Borland στο DOS το κάνει μιά χαρά: >#include <stdio.h> #include <math.h> int main(void) { int i=1, red=3, green=5; float result=0; result = pow(red,(green-i)); printf("%f", result); return 0; } Αν αλάξω αυτήν την γραμμή: >result = pow(red,(green-i)); Με αυτήν εδώ >result = pow(red,(green-1)); Τότε κάνει compile. Παράξενο...
Moderators Praetorian Δημοσ. 11 Απριλίου 2007 Moderators Δημοσ. 11 Απριλίου 2007 Νόμίζω ότι ίσως βοηθούσε να λύσουμε το ...παράξενο αν είχαμε και το output του compiler.
Directx Δημοσ. 11 Απριλίου 2007 Δημοσ. 11 Απριλίου 2007 Το cast ενός float σε int θέλει πάντα λίγη προσοχή όσον αφορά την στρογγυλοποίηση του αριθμού και την ακρίβεια του αποτελέσματος. Από εκεί και πέρα, για τον κώδικα που δεν λειτουργεί με τον GCC όπως είπε και ο Praetorian πρέπει να αναρτήσεις το μήνυμα λάθους.
jsmith6 Δημοσ. 13 Απριλίου 2007 Μέλος Δημοσ. 13 Απριλίου 2007 το output του compiler: >/tmp/cc8ChRUX.o: In function `main': test.c:(.text+0x4b): undefined reference to `pow' collect2: ld returned 1 exit status Βάζοντας όμως το option -lm στον GCC, δούλεψε. Θα το είχα καταλάβει ότι ήταν αυτό αν μου γκρίνιαζε κάθε φορά που χρησιμοποιούσα την pow(). Βάζοντας αριθμούς αντί για μεταβλητές δεν παραπονιόταν. Το cast ενός float σε int θέλει πάντα λίγη προσοχή όσον αφορά την στρογγυλοποίηση του αριθμού και την ακρίβεια του αποτελέσματος. Ναι. Όλοι οι αριθμοί είναι θετικοί integer. Βασικά έχω να κάνω με συνδιασμούς. Ευχαριστώ Legionnaire, chiossif, Praetorian, και Directx.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.