Saumya Bhatt
Saumya Bhatt

Reputation: 89

Not receiving output even after writing printf("...")

I've written a code to find the reciprocal of a number without using division but rather approximating it using bisection method. Got two doubts. One, what should I keep the lower limit and the upper limit for x? Also is there a faster method to converge from the limits to the required value(reciprocal of the input) rather than just averaging it? And the main doubt, when I try to run it, It just stops after receiving the input number from the user. Any hints so solve that?

Here is the code:

#include<stdio.h>
#include<cstdlib>
#define epsilon 0.0001
float f(float x, float &m)
{
    if(m==0)
    {
        printf("Reciprocal not defined");
        return 0.0;
    }
    else
    {
        return x+1/m;
    }
}
int main(void)
{
    float m,g1,x,g2,c;
    printf("Enter a number:\n");
    scanf("%f",f(x,m));
    g1=epsilon;
    g2=m;
    while(abs(f(g1,m)-f(g2,m))>epsilon)
    {
        c=(g1+g2)/2;
        if(f(g1,m)*f(c,m)<0)
        {
            g2=c;
        }
        else if(f(c,m)*f(g2,m)<0)
        {
            g1=c;
        }
    }
    printf("The reciprocal is approximately %f",c);

}

The code is expected to work as follows:

Enter a number: 5
The reciprocal is approximately 0.2
Enter a number: 0
Reciprocal is not defined

Instead of this, it shows:

Enter a number:
Reciprocal is not defined            

(without accepting any input)

Upvotes: 1

Views: 113

Answers (1)

Jabberwocky
Jabberwocky

Reputation: 50775

Your overall code is far too convoluted and your usage of scanf doesn't make sens.

You probbaly want something like this:

#include <stdio.h>
#include <cstdlib>
#include <cmath>

#define epsilon 0.0001f

int main(void)
{
  float m, g1, g2, c, diff;
  printf("Enter a number:\n");
  scanf("%f", &m);

  g1 = epsilon;
  g2 = m;

  do
  {
    c = (g1 + g2) / 2;
    diff = c * m - 1.0f;
    if (diff > 0)
      g2 = c;
    else
      g1 = c;
  } while (fabs(diff) > epsilon);

  printf("The reciprocal is approximately %f", c);
}

For your question "Also is there a faster method to converge from the limits to the required value (reciprocal of the input) rather than just averaging it?", I have no idea, but searching by bisection is generally rather fast.

Test program that tests for a range of values:

#include <stdio.h>
#include <cstdlib>
#include <cmath>

#define epsilon 0.0001f

int main(void)
{
  float g1, g2, c, diff;

  for (float m = 1; m < 20; m += 1)
  {
    g1 = epsilon;
    g2 = m;

    do
    {
      c = (g1 + g2) / 2;
      diff = c * m - 1.0f;
      if (diff > 0)
        g2 = c;
      else
        g1 = c;
    } while (fabs(diff) > epsilon);

    printf("The reciprocal of %f is approximately %f vs. %f, diff %f\n", m, c, 1/m, c-1/m);
  }
}

Live demonstration

Upvotes: 4

Related Questions