• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

gdzie popelnilam blad? wszystkie errory ktore wykryl kompilator zostaly usuniete jednak program w dalej nie dziala

Object Storage Arubacloud
0 głosów
118 wizyt
pytanie zadane 7 września 2020 w C i C++ przez Agata_ Nowicjusz (190 p.)

program ma za zadanie wygenerowac liczbe pi za pomoca metody eulera

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
	
	float a[1000000], b[1000000];
	
	float r=0.5, c;
	
	int i, k=0;
	
	srand(time(NULL));
	
	for(i=0; i<1000000; i++) {
		a[i]=(rand()%(1000000)+(0));
		b[i]=(rand()%(1000000)+(0));
		
		a[i]=a[i]/1000000;
		b[i]=b[i]/1000000;
		
		a[i]=a[i]-(0.5);
		b[i]=b[i]-(0.5);
		
		printf("%f %f\n", a[i], b[i]);
		
		if((a[i]*a[i])+(b[i]*b[i])<r || (a[i]*a[i])+(b[i]*b[i])==r) {
			k++;
		}
	
	}
	
	c=(k/1000000)*4;
	
	printf("%f\n", c);
	
	
}

 

komentarz 7 września 2020 przez Oscar Nałogowiec (29,320 p.)
Najważniejszy błąd to założenie, że usunięcie błędów kompilacji daje działający program. To dopiero początek. Dopiero zaczyna się uruchamianie programu.

Masz strasznie duże tablice jako zmienne automatyczne - na stosie.  W tym kodzie najlepiej będzie auto przesunąć ich deklaracje przed nagłówek funkcji main, albo dodać im static tu gdzie są.

Co do samego algorytmu się nie wypowiem, bo nie znam go na pamięć.
komentarz 7 września 2020 przez adrian17 Ekspert (344,860 p.)

Masz strasznie duże tablice jako zmienne automatyczne - na stosie.  W tym kodzie najlepiej będzie auto przesunąć ich deklaracje przed nagłówek funkcji main, albo dodać im static tu gdzie są.

Inna sprawa, że te tablice w zasadzie są zupełnie niepotrzebne do tego napisanego algorytmu.

komentarz 7 września 2020 przez tkz Nałogowiec (42,000 p.)

@Oscar, Przesunięcie tablic przed main nie zmieni ich sposobu alokacji na alokacje na stercie, często w ten sposób pamięć trafia do "data segment". Dodanie static tak, ale jest to sztuczka, która nie powinna być pierwszym wyborem. Poza tym "wielkie" tablice, to "zaledwie", niespełna 4MB, gdzie stos na windowsie ma 4, więc jest okey. Na linuxie zazwyczaj więcej. https://alg24.com/pl/obliczanie-liczby-pi-metoda-monte-carlo-w-c

2 odpowiedzi

0 głosów
odpowiedź 7 września 2020 przez adrian17 Ekspert (344,860 p.)
Nie wiem czy to jedyny błąd, ale dzielisz inta mniejszego od 1000000 przez 1000000, więc wychodzi 0.

Powinieneś działać na liczbach zmiennoprzecinkowych w momencie wykonywania dzielenia.
0 głosów
odpowiedź 7 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

Do czego potrzebne są Ci tablice? W ogóle ich nie potrzebujesz. Druga sprawa to użycie generatora rand(), który zupełnie nie nadaje się do Monte Carlo, gdyż zafałszowuje wyniki (nie generuje akceptowalnych losowych wartości). Użyj uniform_real_distribution jak w załączonym przykładzie:

#include <iostream>
#include <random>

using namespace std;

int main()
{
    const int resolution {10000000};

    double x {0.0} , y {0.0};
    double radius {0.5};
    int match {0};

    random_device rd;
    mt19937 mt(rd());
    uniform_real_distribution<double> dist(0.0,2.0*radius);

    for( int i=0 ; i<resolution ; ++i )
    {
        x = dist(mt) - radius;
        y = dist(mt) - radius;
        if((x*x)+(y*y)<radius*radius) ++match;
    }

    cout << (static_cast<double>(match)/static_cast<double>(resolution))*4.0;
    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 83 wizyt
0 głosów
0 odpowiedzi 227 wizyt
pytanie zadane 22 września 2017 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 245 wizyt
pytanie zadane 4 września 2017 w C i C++ przez inlooky Nowicjusz (120 p.)

92,582 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...