2015-09-25 5 views
2

Я новый программист на C, и я работаю над школьным проектом, где мне нужно приблизиться к значению или пи. Мой профессор заявил, что мы должны объявить все целочисленные термины, используя long double. Консоль показывает, что я спрашиваю у пользователя, сколько терминов аппроксимирует значение pi, заданное функцией. Я ввожу 1 для количества терминов, но код возвращает -0.00000000 вместо 4.00000000.C - long double and printf issue

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

long double approx1(int terms) 
{ 
    long double pi = 0; 
    long double num = 4; 
    long double denom = 1; 
    int i; 

    for(i=1; i <= terms; i++) 
    { 
     if(i%2 != 0) 
     { 
      pi=pi+(num/denom); 
     } 
     else 
     { 
      pi=pi-(num/denom); 
     } 
     denom = denom + 2; 
    } 
    printf("%.8Lf\n", pi); 
} 

int main() 
{ 
    int terms; 
    long double pie; 

    printf("input number of terms, input 0 to cancel\n"); 
    scanf("%d", &terms); 

    while(terms != 0) 
    { 
     if(terms > 0) 
     { 
      pie = approx1(terms); 
      printf("%.8Lf\n", pie); 
      printf("GG mate\n"); 
      break; 
     } 
     else 
     { 
      printf("Incorrect input, please enter a correct input\n"); 
      scanf("%d", &terms); 
     } 
    } 
} 

У меня не было никакого успеха в том, чтобы заставить его работать (он работает с поплавком). Что я делаю не так? (Я использую Code Blocks с включенным компилятором btw.)

+0

«все целые термины с использованием' long double'' 'long double' не являются целыми. Что вы имеете в виду? – Olaf

+1

Если ваш Code :: Blocks IDE использует компилятор MinGW GCC (который, как мне кажется, распространен), вы также можете столкнуться с этой проблемой: http://stackoverflow.com/a/7136886/12711 Я считаю, что более новые версии MinGW решает проблему, реализуя специальную поддержку 'printf()' вместо того, чтобы полагаться только на использование 'msvcrt.dll'. Поэтому вы можете попробовать более новую версию MinGW или MinGW-w64. –

ответ

5

Вы забыли добавить оператор return в свою approx1() функцию. С помощью этого оператора return, если вы используете возвращаемое значение, он вызывает undefined behavior.

Цитирование C11 стандарт, глава §6.9.1

Если }, что завершает функцию достигается, и значение вызова функции используется вызывающему, поведение не определено.