Ich schrieb ein kurzes Programm in C, um lineare Interpolation durchzuführen, die iteriert, um eine Wurzel einer Funktion zu einer gegebenen Anzahl von Dezimalpunkten zu geben. Bisher für eine Funktion f (x):Warum gibt C Python für diesen Algorithmus verschiedene Werte?
long double f(long double x) {
return (pow(x, 3) + 2 * x - 8);
}
Das Programm konvergiert nicht zu einem 1dp-Wert. Das Programm aktualisiert Variablen a und b, zwischen denen die Wurzel von f (x) liegt, bis a und b beide auf die gleiche Zahl mit einer gegebenen Genauigkeit runden. Mit langen Doppelzimmer und die obige Funktion, zeigt ein Debugger für die ersten 2 Wiederholungen:
a = 1.5555555555555556
a = 1.6444444444444444
obwohl es hätte sein sollen:
a = 1.5555555555555556
a = 1.653104925053533
Das Programm schlägt fehl Werte danach zu aktualisieren. Die Gleichung für die lineare Interpolation, die ich verwende, ist eine umgeordnete Version des mathematischen here und der Code, den ich benutze, ist eine C-Version eines Python-Programms, das ich geschrieben habe. Warum erhält die C-Implementierung trotz des gleichen Algorithmus unterschiedliche Werte und wie kann ich sie beheben?
OK Ich bin immer noch den Dreh dieser bekommen, aber hoffentlich unten Ich habe einen Minimal, Complete, und prüfbare Beispiel:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
long double a; long double b; long double c; // The values for interpolation
long double fofa; long double fofb; long double fofc; // The values f(a), f(b) and f(c)
const int dp = 1; // The number of decimal places to be accurate to
long double f(long double x) {
return (pow(x, 3) + 2 * x - 8);
}
int main(void) {
a = 1; b = 2;
while(roundf(a * pow(10, dp))/pow(10, dp) != roundf(b * pow(10, dp))/pow(10, dp)) { // While a and b don't round to the same number...
fofa = f(a); fofb = f(b); // Resolve the functions
printf("So f(a) = %g, f(b) = %g\n", (double)fofa, (double)fofb); // Print the results
c = (b * abs(fofa) + a * abs(fofb))/(abs(fofb) + abs(fofa)); // Linear Interpolation
fofc = f(c);
if(fofc < 0) {
a = c;
}
else if(fofc == 0) {
a = c;
break;
}
else {
b = c;
}
}
printf("The root is %g, to %d decimal places, after %d iterations.\n", (double)a, dp, i);
}
Sie können nicht einige Debug verwenden, um welche Werte zu sehen Sie bekommen für 'fofa' (was ist' f (a) ', nehme ich an),' fofb', und alle anderen Zwischenwerte? – Teepeemm
Was verwenden Sie als Wert für "dp" (1, 10, 15, etwas anderes)? Warum benutzt du 'float'-precision mit' roundf() ', wenn du' long double' für 'a' und' fofa' usw. hast? (Sie sollten 'roundl()' und 'powl()' (anstelle von 'pow()') verwenden, es sei denn, Sie verwenden '', aber Sie sollten erwähnen, dass, wenn Sie es sind und Sie nicht würden benutze 'roundf()', aber nur 'round()' ... –
Bitte stelle ein [mcve], kein Puzzlespiel zur Verfügung, siehe auch [ask] – Olaf