Program inaczej dziala na gcc i inaczej na Dev Cpp

0

Witam,
mój problem wygląda następująco:
Program działa zupełnie inaczej na moim komputerze, oraz moim szkolnym komputerze a inaczej na komputerze wykładowcy.
My korzystamy z linuxa i kompilujemy w terminalu przez gcc, natomiast Wykladowca kompiluje pod windowsem Dev Cpp (z tym ze dev takze korzysta z gcc -.- ),
mimo wszystko program u mnie dziala bezblednie a u Prowadzacego zle.
Sprawdzcie dla wartosci 25. U mnie wypisuje ze jest automorficzna, natomiast u oceniajacego wystwietla ze nie jest....

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

int cyfry(int liczba) //funkcja sprawdzajaca ile cyfr ma wprowadzona liczba
{
  int b=1;
  while(liczba>10){
    liczba=liczba/10;
    b++;
    }
  return b; //zmienna przchowujaca ilosc cyfr liczby wprowadzonej przez uzytkownika
}

int czy_automorficzna(int z){
  int x, i, zpot, modulo, potega, wynik;
  x=cyfry(z);
  modulo=1;
  for(i=0;i<x;i++){ /*uzyskuje w petli liczbe przez ktora podziele sprawdzana zmienna, adekwatna do dlugosci zmiennej*/
    modulo=modulo*10;
  }
  potega=pow(z,2);
  zpot=potega%modulo;  //otrzymuje reszte z dzielenia
  if(z==zpot) wynik=1; //zwracanie wartosci logicznej 0 lub 1
  else wynik=0;

  return wynik;
}
int main(){

  int a;
  printf("Wprowadz liczbe ktora chcesz sprawdzic czy jest automorficzna:\n");
  scanf("%i", &a);
  while(a<1){
    printf("Liczba musi nalezec do zbioru l. Naturalnych!\nWprowadz ponownie:\n");
    scanf("%i", &a);
  }

  if(1==czy_automorficzna(a)) printf("Liczba jest automorficzna\n"); /* sprawdzam czy wprowadzona liczba jest rowna reszcie z dzielenia potegi tej liczby*/
  else printf("Liczba nie jest automorficzna\n");
  return 0;
}
0

Tyle nakręcono zamiast zapisać całość po ludzku:

int czy_automorficzna(int z) { return z==(z*z)%(int)pow(10,1+(int)log10(z)); }
3

jedynie co widzę, że jest źle to pow(z,2) zamiast z*z, ale to raczej nie powoduje różnic.
Pytanie jak prowadzący testuje? Widziałeś, że wpisał 25 i miał zły wynik? A może wpisał 90625 bo wtedy twój kod daje zły wynik.

0

Tak, pobrał kod przy mnie z moodle, skompilował w Dev Cpp i wpisał 25 i wywaliło że nie jest automorficzna.
Ja nie wierzyłem, więc podszedłem do swojej maszyny, również pobrałem z tego samego źródła, skompilowałem i miałem inny wynik.

2

Powiedz chociaż, że to jest Orwell Dev-C++, w aktualnej wersji 5.4.0. bo jeśli to jest coś starego z kompilatorem GCC 2.95 to... „jest to produkt już niewspierany przez forum 4programmers”. ;-)

0

Okej, już wiem co poprawić aby działał w Dev... zamieniłem w funkcji czy_automorficzna potega=pow(z,2); na potega=z*z;
i działa bezbłędnie. Pytanie tylko dlaczego taka dziwna zależność? Czy Dev nie rozumie bilbioteki <math.h>, rozumie na pewno.
Czy ktoś z bardziej doświadczonych kolegów mógłby mi rozjaśnić dlaczego tak się dzieje?

3

pow(double x,double y) przeważnie jest realizowany jako: return exp(ylog(x)); Więc exp(2log(25)); nie koniecznie wynosi równo 625 może wynosić np 624.999999999999999999999 po konwersji do int będzie to 624
Sprawdź to tak:

if(pow(25,2)<625) cout<<"Właśnie o to poszło"<<endl;
0

Małe sprostowanie bo w obliczeniach mi nie wychodziło, chodzi oczywiście o logarytm naturalny, czyli pow(double x, double y) jest realizowane jako return(exp(y*ln(x));
Dzięki za odp.

0
_13th_Dragon napisał(a):

pow(double x,double y) przeważnie jest realizowany jako: return exp(ylog(x)); Więc exp(2log(25)); nie koniecznie wynosi równo 625 może wynosić np 624.999999999999999999999 po konwersji do int będzie to 624
Sprawdź to tak:

if(pow(25,2)<625) cout<<"Właśnie o to poszło"<<endl;

Wydaje mi się to dziwne.
Poniższy program:

#include <cmath>
#include <cstdio>

int main(int argc, char *argv[] )
{
const double x = strtod(argv[1],NULL);
const double y = strtod(argv[2],NULL);
const double z = strtod(argv[3],NULL);
printf("|%lf^%lf-%lf] = %18.16lf (%s) \n" , x , y , z , fabs(pow(x,y)-z) , pow(x,y)==z?"true":"false" );
return 0;
}

Uruchomiony z argumentami 25 2 625 wyświetla:
|25.000000^2.000000-625.000000] = 0.0000000000000000 (true)

0

Odpal to z optymalizacją oraz bez

#include <iostream>
#include <cmath>
using namespace std;
 
int main()
  {
   for(unsigned x=1;x<=0xFFFF;++x) if(pow(x,2)!=x*x) cout<<x<<endl;
   cout<<"--- end ---"<<endl;
   return 0;
  }
0
_13th_Dragon napisał(a):

Odpal to z optymalizacją oraz bez

Optymalizacja nie powinna powodować błędnego działania. Odpal to
z argumentami: 0 100 3. U mnie nie wyświetla ani jednego x na
żadnych ustawieniach optymalizacji.

int main( int argc, char *argv[] ) {
const double start = atof(argv[1]);
const double stop = atof(argv[2]);
const double p = atoi(argv[3]);

for( double x=start ; x<=stop ; x+=1.0/1024 )
	if( pow(x,p) != (x*x*x) )
		printf("%lf\n",x);

return 0;

}

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