2013-11-01 3 views
3

Я пытаюсь написать квази-Монте-Карло Приближение pi в C. Я еще не очень разбираюсь в этом, и я пытаюсь перевести свои навыки на основе python, поэтому я могу просто что-то игнорировать. В результате я получаю 0, и я не могу понять, почему. Как мне это исправить? Кроме того, я получаю сообщение об ошибке на последних двух звонках printf, говорящих, что они типа double *, а не double. Так или иначе, это связано?Pi-аппроксимация в C - почему я получаю результат 0 для приближения?

#include <stdio.h> 
/* 
Tristen Wentling 
montepithon.c 
October 31, 2013 

*/ 
int main(void) 
{ 
    float i,j,x; 
    float count=0,counter=0; 
    printf("Please enter the desired grid division size (n=?)"); 
    scanf("%f", &x); 
    float y=x*x; 
    if(x==0){ 
     printf("goodbye"); 
    } 
    else if(x!=0){ 
     for(i=0;i<=x;i++){ 
      for(j=0;j<=x;j++){ 
       float check=((i*i)*(1/y))+((j*j)*(1/y)); 
       /*printf("%f\n", check);*/ 
       if(check<=1){ 
        count+=1; 
       } 
       else{ 
        counter+=1; 
       } 
      } 
     } 
    } 
    else{ 
     printf("error"); 
    } 
    float prsum=count/y; 
    float ptsum=(1-counter)*(1/y); 
    double pirprox=4*prsum; 
    double pitprox=4*ptsum; 
    printf("%f\n", &pirprox); 
    printf("%f\n", &pitprox); 
    getchar(); 
} 
+0

предупреждения в C такие же, как ошибки. Не игнорируйте их. В этом случае компилятор сообщает вам, что вы передаете адрес переменной вместо самой переменной. Пожалуйста, следуйте его советам. В противном случае вы не увидите результат своего кода. Также: (1) SO не является сайтом для проверки кода, (2) если вы отправляете код (когда у вас есть конкретный технический вопрос), пожалуйста, отложите его правильно. –

+0

Извините. Я обычно спрашиваю убунту и математику. Я думал, что здесь лучше всего подходить под описание. Где этот вопрос задают более правильно? – Tristen

+0

Вы понимаете, что разделение разрешено, не так ли? Каждое появление '* (1/y)' в вашей программе будет быстрее и точнее (и короче), если оно было написано '/ y'. –

ответ

6

%f спецификатор формата в printf ожидает double аргумент типа. &pirprox и &pitprox имеет тип double *, и вы не можете распечатать адрес с %f. Неправильный спецификатор формата будет вызывать неопределенное поведение.
Измените ваш фрагмент кода

printf("%f\n", &pirprox); 

printf("%f\n", &pitprox); 

к

printf("%f\n", pirprox); 

printf("%f\n", pitprox); 
+2

Он отлично работает после исправления, спасибо за то, что я заметил. – Tristen

+0

'return 0;' может быть опущен в 'main()' с C99. –

+0

@PascalCuoq; Да, ты можешь. Но добавление его в 'main' неплохое. Взгляните на спецификацию C11: ** 5.1.2.2.3: ** 'Если тип возврата основной функции является типом, совместимым с int, возврат от начального вызова к основной функции эквивалентен вызову функция выхода со значением , возвращенная основной функцией в качестве аргумента, 11) достижение функции}, которая завершает основную функцию , возвращает значение 0. Если тип возврата несовместим с int, статус завершения возвращается на хост среда не определена .' – haccks