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

C: fscanf and rounding error


vamos

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

Δημοσ.

Geia xara,

 

antimetopizo to eksis provlima.

 

exo ena txt arxeio pou perilambanei tis eksis times:

 

---------------

0.553842

0.643939

0.416941

0.876019

0.234986

0.429439

0.680470

0.322184

0.600104

0.131541

---------------

 

Apothikeuo tis times autes, se ena GSL vector os eksis:

 

FILE * f1 = fopen("data.txt","r");

 

for (i=0; i<n; i++) {

 

fscanf(f1,"%lf ", &(Y->data));

 

fscanf(f1,"\n");

 

}

 

kai otan tis typono me printf pairno auto:

 

for ( ... ) {

 

printf("%.20lf\n", Y->data)

 

}

 

0.55384199999999995000

0.64393900000000004000

0.41694100000000001000

0.87601899999999999000

0.23498600000000000000

0.42943900000000002000

0.68047000000000002000

0.32218400000000003000

0.60010399999999997000

0.13154099999999999000

 

eno tha perimena kati tetoio:

 

0.55384200000000000000

0.64393900000000000000

....

 

Giati ginetai auto? Pos mporei na diorthothei? kamia idea?

 

eida sto net: http://www.eskimo.com/~scs/C-faq/q14.1.html

 

alla den dinei apantisi, sto pos tha lynetai auto to provlima.

 

euxaristo ek ton proteron.

Thodoris

Δημοσ.

Γενικά δεν διορθώνεται, η ακρίβεια του Η/Υ είναι πάντα περιορισμένη.

1) Κατά την εκτύπωση μπορείς να τυπώνεις λιγότερα ψηφία, ώστε να στρογγυλεύεται στα αρχικά, ή

2) Χρησιμοποίησε μια βιβλιοθήκη για "μεγάλους αριθμούς" οι οποίοι σου δίνουν πάρα πολύ μεγάλη ακρίβεια: http://www.swox.com/gmp/

GMP is a free library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating point numbers. There is no practical limit to the precision except the ones implied by the available memory in the machine GMP runs on. GMP has a rich set of functions, and the functions have a regular interface.

Δημοσ.
Geia xara' date='

 

antimetopizo to eksis provlima.

 

exo ena txt arxeio pou perilambanei tis eksis times:

 

---------------

0.553842

0.643939

0.416941

0.876019

0.234986

0.429439

0.680470

0.322184

0.600104

0.131541

---------------

 

Apothikeuo tis times autes, se ena GSL vector os eksis:

 

FILE * f1 = fopen("data.txt","r");

 

for (i=0; i<n; i++) {

 

fscanf(f1,"%lf ", &(Y->data[i']));

 

fscanf(f1,"\n");

 

}

 

kai otan tis typono me printf pairno auto:

 

for ( ... ) {

 

printf("%.20lf\n", Y->data)

 

}

 

0.55384199999999995000

0.64393900000000004000

0.41694100000000001000

0.87601899999999999000

0.23498600000000000000

0.42943900000000002000

0.68047000000000002000

0.32218400000000003000

0.60010399999999997000

0.13154099999999999000

 

eno tha perimena kati tetoio:

 

0.55384200000000000000

0.64393900000000000000

....

 

Giati ginetai auto? Pos mporei na diorthothei? kamia idea?

 

eida sto net: http://www.eskimo.com/~scs/C-faq/q14.1.html

 

alla den dinei apantisi, sto pos tha lynetai auto to provlima.

 

euxaristo ek ton proteron.

Thodoris

 

Ο κωδικας σου ειναι λανθασμενος.

Στις συναρτησεις scanf και printf πρεπει να χρησιμοποιησεις σαν τροποποιητη το L για τους αριθμους κινητης υποδιαστολης.Ο τροποποιητης l ειναι για ακεραιους.

Δηλαδη δωσε Lf και οχι lf.

 

π.χ. scanf("%Lf", &Float_point_variable );

αντιστοιχα scanf("%lf", &integer_variable );

 

τα ιδια και για την printf .

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

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

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