Я написал короткую программу на C, чтобы выполнить линейную интерполяцию, которая итерации дает корень функции заданному числу десятичных точек. До сих пор для функции f (x):Почему C дает разные значения для Python для этого алгоритма?
long double f(long double x) {
return (pow(x, 3) + 2 * x - 8);
}
Программа не сходится к значению 1dp. Программа обновляет переменные a и b, между которыми лежит корень f (x), до тех пор, пока a и b не будут округлены до одного и того же числа с заданной точностью. Использование длинных дублей и выше функции, отладчик показывает в течение первых 2-х итераций:
a = 1.5555555555555556
a = 1.6444444444444444
, хотя это должно было быть:
a = 1.5555555555555556
a = 1.653104925053533
Программа не может изменять значения после этого. Уравнение для линейной интерполяции, которое я использую, представляет собой перестроенную версию математической заданной here, а код, который я использую, - это C-версия программы-питона, которую я написал. Почему реализация C получает разные значения, несмотря на тот же алгоритм, и как я могу это исправить?
ОК я все еще получаю повесить, но, надеюсь, ниже меня Minimal, полный и проверяемый пример:
#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);
}
не могли бы вы использовать некоторые отладки, чтобы увидеть, какие значения вы получаете для 'fofa' (который, как я полагаю,' f (a) '),' fofb' и все остальные промежуточные значения? – Teepeemm
Что вы используете как значение для 'dp' (1, 10, 15, что-то еще)? Почему вы используете 'float'-precision с' roundf() ', когда у вас есть' long double' для 'a' и' fofa' и т. Д.? (Вы должны использовать 'roundl()' и 'powl()' (а не 'pow()'), если вы не используете '', но вы должны упомянуть, что если вы и не хотите используйте 'roundf()', но просто 'round()' ... –
Пожалуйста, предоставьте [mcve], а не игру-головоломку. Также см. [ask] – Olaf