2017-11-23 6 views
1

ich einen sehr einfachen Code hergestellt, die die Werte einer Funktion berechnet: Variable im Header von #define definiert wird nicht durch den Code festgelegt

#define MIN 0.00001 
#define MAX 1 
#define MAXP 10000 


double func_log(double x) 
{ 
    double r=RPWN; 
printf(" MAXP = %e \n",MAXP); 
printf(" MIN = %e \n",MIN); 
printf(" MAX = %e \n",MAX); 

    double y; 
    if (x>r || x==0) return(0.0); 
    else { 
     y = r+((r*r)/(2.*x)-x/2.)*log((1+r/x)/(r/x-1)); 
    } 
    return y;  

} 

Das fonction in einem file.c ist, die ist mit anderen Quelldateien kompiliert. Das Problem ist, dass MAXP nicht auf seinen Wert festgelegt werden kann. Hier ist, was ich bekomme, wenn ich fragen, die Werte von MIN auszudrucken, MAXP und MAXP:

MAXP = 4.940656e-324 
MIN = 1.000000e-05 
MAX = 1.000000e+00 

Ich verstehe wirklich nicht, warum ich 4.940656e-324 für MAXP bekommen, ich hatte noch nie eine solche Frage. Auch wenn ich #define MAXP 10000. schreibe, bekomme ich dann MAXP = 1.000000e+04. Ich kompiliere mit gcc, hat jemand eine Ahnung?

+1

MAX und MAXP sind integ er Konstanten werden als Doppel gedruckt. Glück gehört nicht zu den Möglichkeiten. Fügen Sie Dezimalstellen zu den Definitionen hinzu. –

+0

Compiler Warnungen aktivieren. Abstimmung, um dies als einfacher Tippfehler zu schließen. – Lundin

+1

@Lundin nicht unbedingt ein Tippfehler, die Frage ist in Ordnung. Für einen Anfänger kann dieses Verhalten tatsächlich seltsam aussehen –

Antwort

3

Das Problem liegt nicht im Wert von MAXP, sondern im Formatspezifizierer %e, den Sie verwenden, um es zu drucken.

MAXP ist keine Variable, es ist ein Makro. Daher ist kein Typ damit verbunden. Der Compiler ermittelt aus dem Kontext den Typ 1000, der im Fall printfint bedeutet (die Standardinterpretation 1000). In einem anderen Kontext könnte 1000 als float oder double, z.B. float f = MAXP; Eine wichtige Sache zu erinnern ist, dass im Body des Codes durch 1000 ersetzt wird.

Wenn Sie MAXP wollen als Doppelstandardmäßig interpretiert werden, fügen .0 am Ende:

#define MAXP 10000.0 

Wenn Sie es wünschen ein Ganzzahlliteral zu bleiben, verwenden %d es drucken

printf(" MAXP = %d \n", MAXP); 

oder eine explizite Umwandlung hinzufügen:

printf(" MAXP = %e \n", (double)MAXP); 
+1

In der Tat, Sie brauchen nicht einmal die "0" am Ende (falls es eine Möglichkeit gibt, dass es durch den Programmierer als eine signifikante Zahl verwechselt wird), brauchen Sie nur den Dezimalpunkt oder ein Exponententeil. –

2

Das Problem ist, dass %e Float und doppelte Typen, aber Ihre MAXP und MAX-Typ Integer.

Sie können %d verwenden, um Ganzzahlen zu drucken.

Verwandte Themen