Jak zastąpić komendę?

0

Witam,
Krótki opis sytuacji.
Do wykonania mam zadanie :
Zdefiniuj funkcję parametrów x i n, wyznaczającą iteracyjnie wartość:
f1(x,n) = 1/x + 1/ x2 + 1/ x 3+ 1/ x4 + . . . + 1/ x n ;
W funkcji main wielokrotnie wczytuj argumenty x i n, a następnie obliczaj i prezentuj
wartość funkcji, aż do momentu podania x == 0 lub n <= 0.

Mój kod wygląda tak :

#include <stdio.h>
#include <math.h>

double funkcja (double, double);

int main()
{
	double wynik, x, n;
	
	while(1)
	{
	printf("Podaj wartosc x oraz n :");
	scanf("%lf%lf", &x, &n);

	if(x == 0)
		break; 

	if(n<=0)
		break;

	wynik = funkcja ( x, n ) ;

	printf(" Wartosc funkcji to : %.3lf \n", wynik);
	}
	
}
double funkcja( double x, double n )
{
	int i;
	double f = 0; 

	for( i = 1; i <= n; i++ )
		{
			f += 1 / pow(x, i); 
		}

	return f; 
}

Pytanie brzmi : W jaki sposób można zastąpić komendę " pow " ?
Z góry dziękuję i pozdrawiam

3

Mnożeniem :)
Zacznij od jakiegoś double p = x; a potem co iteracje pętli rób p *= x;.

Gdyby nie były to potęgi z kolejnymi, naturalnymi wykładnikami, tylko np. wykładnik byłby liczbą rzeczywistą, to musiałbyś zaimplementować jakiś ciekawszy numerycznie algorytm.

0

Ok, dzięki :)

3
  1. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Używaj wyłącznie angielskiego nazewnictwa: http://4programmers.net/Forum/1208091
  3. Do liczników wszelkiego rodzaju użycie double - to sabotaż własnej pracy
  4. Wg mnie lepiej jakoś tak:
#include <stdio.h>
#include <math.h>
 
double func(double x,unsigned count)
  {
   double sum=0,add;
   for(add=1/x;count--;add/=x) sum+=add;
   return sum;
  }
 
int main()
  {
   double x;
   unsigned count;
 
   while(1)
     {
      printf("Podaj wartosc x oraz n: ");
      if(scanf("%lf%u",&x,&count)==2)
        {
         if((!x)||(!y)) return 0;
         printf("Wartosc funkcji to : %.3lf\n",func(x,count));
        }
      else printf("Trzeba podać liczby\n");
      while(getchar()!='\n') {}
     }
  }
0

Czemu przy licznikach double jest złe?

0
RybaSG napisał(a):

Czemu przy licznikach double jest złe?
Temu: http://ideone.com/9Y579a

7

@RybaSG
To ja przewrotnie napiszę, że akurat w przykładzie który miałeś, dla naturalnych n poniżej 252-1 (give or take) i tak by wszystko działało (związane z wyliczaniem w pętli ofc; przy czym precyzja i by się skończyła trochę szybciej), niemniej jednak warto zapoznać się z tym jak floaty działają od wewnątrz :)
@Sopelek rzucił kontr-przykład, w którym akurat liczba przy liczniku nie jest poprawnie reprezentowana we floatach (do 223-1 by było dobrze, ale 20000000.0f jest w okolicy 2**25 ;)

@_13th_Dragon
W ramach czepiania się szczegółów (co tak lubimy na forum uprawiać), Twój przykład nie pokazuje, że użycie double do licznika i jest niepoprawne - wszystkie liczby od 0 do 999 są poprawnie reprezentowane w double bez straty precyzji, i dodawanie +1 do nich również nie powoduje straty w precyzji.
Problem braku precyzji leży natomiast (jak pewnie wiesz) w tym jak obliczane jest A i B (0.1 nie można wyrazić bez straty precyzji w double).

3
_13th_Dragon napisał(a):
RybaSG napisał(a):

Czemu przy licznikach double jest złe?
Temu: http://ideone.com/9Y579a

Tak jak GC napisał, pokazałeś że stukrotne dodanie do siebie 0.1 nie da dokładnie 100. Błąd będzie identyczny dla użycia double i dla użycia int jako licznika.
Jednak jest uzasadnienie dla nieużywania double w licznikach: wydajność. Jeśli co iterację zmienna zwiększana jest o liczbę naturalną, to nie ma żadnego uzasadnienia dla używania jako typu tej zmiennej czegoś innego niż typ naturalny/całkowity. Co prawda w praktyce spadek wydajności będzie zwykle pomijalny, ale użycie takiej konstrukcji to programistyczne faux pas, takie pierdnięcie przy stole, nikt nie umrze, ale wszyscy się skrzywią.

1 użytkowników online, w tym zalogowanych: 0, gości: 1