ujemny wykładnik a fabs()

0

Witam. Borykam się z pewnym problemem, a mianowicie chciałbym, aby funkcja ta obliczała potęgi dla wykładników ujemnych, ale nie rozumiem
dlaczego w takiej sytuacji, w której użyłem fabs() ona nie działa, a w tym krótkim przykładzie już tak?

Przykład:

 
#include <stdio.h>
#include <math.h>
 
int main ()
{
	int b;
	b = -10;
	
	printf("Absoulte value of 3.1416 is %lf\n", fabs (3.1416));
	printf("Absoulte value of %d is %lf\n", b, fabs (b));
	return 0;
}

Mój kod:

#include <stdio.h>
#include <math.h>
double potega(double a, int b);
int main(void)

{
	double x, xpot;
	int n;
	
	printf("Podaj liczbe oraz potege naturalna,");
	printf(" do ktorej podniesiona\nzostanie liczba. Wpisz q,");
	printf(" aby zakonczyc program.\n");
	while (scanf("%lf%d", &x, &n) == 2)
	{
		xpot = potega(x, n);
		printf("%.3g do potegi %d to %.5g\n", x, n, xpot);
		printf("Podaj kolejna pare liczb lub wpisz q, aby zakonczyc.\n");
	}
	printf("Do widzenia!\n");
	return 0;
}

double potega(double a, int b)					
{
	double pot = 1;
	int i;

	if (b > 0)
		for (i = 1; i <= b; i++)
			pot *= a;
	if (b = 0)
			pot = 1;
	if (b < 0)
		for (i = 1; i <= fabs (b); i++)	/* ??? */
			pot *= 1/a;
			
	return pot;
} 
3

if (b = 0) przypisanie zamiast porównania. Gdybyś tylko kompilował z włączonymi warningami...

Tak przy okazji: do liczb całkowitych abs a nie fabs.

0

Rzeczywiście :).
Co do kompilacji z warningami to może muszę coś pozmieniać, bo zauważyłem, że niektóre mi wyskakują. W każdym razie dziękuję za szybką pomoc i za wskazówkę.

Pozdrawiam,

0

Dobrą praktyką jest pisać if (0 == a) zamiast if (a == 0), wtedy = zamiast == od razu zakończy się błędem...

0

Kilka poprawek:

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

double potega(double a, int b);

int
main(void)
{
	double x, xpot;
	int n;

	printf("Podaj liczbe oraz potege naturalna,");
	printf(" do ktorej podniesiona\nzostanie liczba. Wpisz q,");
	printf(" aby zakonczyc program.\n");
	while (scanf("%lf%d", &x, &n) == 2) {
		xpot = potega(x, n);
		printf("%.3g do potegi %d to %.5g\n", x, n, xpot);
		printf("Podaj kolejna pare liczb lub wpisz q, aby zakonczyc.\n");
	}
	printf("Do widzenia!\n");

	return (0);
}

double
potega(double a, int b)                    
{
	double pot, tmp;

	/*
	 * W ramach ćwiczeń - co z pozostałymi przypadkami (+/- infty)?
	 */
	if (isnan(a))
		return(NAN);

	if (b == 0) {
		/*
		 * De facto porównanie zmiennej typu double do zera jest błędem,
		 * ale w tym konkretnym przypadku dokładnie to chcemy zrobić.
		 */
		if (a == 0.0)
			return (NAN);

		return (1);
	}
	
	pot = b > 0 ? a : 1.0 / a;
	if (abs(b) == 1)
		return (pot);
	/*
	 * Dla wszystkich praktycznych wartości int powinniśmy mieć mniej niż 20
	 * wywołań.
	 */
	tmp = potega(pot, abs(b) / 2);
	return (tmp * tmp * (abs(b) % 2 == 1 ? pot : 1));
}

0 ^ 0 = NAN, złożoność potęgowania to O(log n), a nie O(n), nieskończoności zostawiam do poćwiczenia.

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