Code::Blocks to środowisko programistyczne.
Upewnij się jakiego kompilatora używasz.
Jeśli twój system to Windows, prawdopodobnie korzystasz z GCC dostarczanego przez MinGW.
Na temat problemów z MinGW podałem już linka. Nie wiem, czy można je obejść przy zachowaniu pełnej funkcjonalności typu
long double. Ostatecznie możesz użyć innego kompilatora, który wspierałby w pełni ten typ lub wyemigrować na Pingwina
Ilu miejsc po przecinku potrzebujesz? Może wystarczy odpowiednio sformatować wyjście
(patrz
printf na
).
Sprawdziłem działanie
long double w środowisku Code::Blocks na kompilatorze LCC.
Program oblicza wartość
\(\displaystyle{ \sqrt{2}}\) za pomocą funkcji z
math.h, oraz implementacji metody Newtona-Raphsona (nie napisałem jej za dobrze) dla typów
double i
long double.
Kod: Zaznacz cały
#include <stdio.h>
#include <math.h>
long double PierwiastekL(long double &val, unsigned int n);
double Pierwiastek(double &val, unsigned int n);
int main()
{
long double lox, loz;
double x, z;
printf("Podaj lox:
");
scanf("%Lf",&lox);
printf("Podaj x:
");
scanf("%lf",&x);
loz = sqrt(lox);
printf("loz=%.25Lf
", loz);
loz = PierwiastekL(lox, 2);
printf("loz=%.25Lf
", loz);
z = sqrt(x);
printf(" z=%.25lf
", z);
z = Pierwiastek(x , 2);
printf(" z=%.25lf
", z);
return 0;
}
long double PierwiastekL(long double &val, unsigned int n)
{
const long double d = 0.00000000000000001;
long double a = 1;
while( fabs(val - pow(a, n)) > d )
a = ( val/pow(a, n-1) + (n-1)*a ) / n;
return a;
}
double Pierwiastek(double &val, unsigned int n)
{
const double d = 0.000000000000001;
double a = 1;
while( fabs(val - pow(a, n)) > d )
a = ( val/pow(a, n-1) + (n-1)*a ) / n;
return a;
}
Zmienne lokalne
d mają maksymalną ilość miejsc po przecinku, która nie sprawiała u mnie problemów.
Rezultat sam oceń:
Kod: Zaznacz cały
loz=1.4142135623730950490000000
loz=1.4142135623730950490000000
z=1.4142135623730950000000000
z=1.4142135623730950000000000