简体   繁体   中英

C - Rounding issues (CS50)

I have been Googling this for days now and I am lost. So doing CS50 online and can't seem to get a handle on this rounding of numbers. My program is messing up multiplying floats like 2.10 with integers like 100 it would output 209.xxxxxxxx

Now like I say I have read countless posts on that I should use ceilf and include but I am getting an error

greedy.c:(.text+0x74): undefined reference to `ceilf' collect2: error: ld returned 1 exit status make: *** [greedy] Error 1 adam@beethoven:~/projects/atom/edx/pSet1/greedy$

I have seen the posts about -lm and a certain file but if I am honest I don't understand what it means.

I am in no way looking for an outright solution, just guidance in improving.

Here is my code, probably not as streamlined as some would like but I am back to basics here ;)

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

int main() {
  // Initialize Variables
  int coinsTotal = 0,
      quarter = 25,
      dime = 10,
      nickel = 5,
      penny = 1,
      cents;
  float changeDue;

  do {
    printf("How much change are you owed? (Format = 0.00)($): ");
    scanf("%f", &changeDue );
    // Convert to cents
    cents = changeDue * 100;
  } while(cents <= 0);

  while (cents >= quarter) {
    cents = cents - quarter;
    coinsTotal = coinsTotal + 1;
  } if (cents == 0) {
      printf("The miminum number of coins is: %d\n", coinsTotal);
  } else {
      while (cents >= dime) {
        cents - dime;
        coinsTotal = coinsTotal + 1;
      } if (cents == 0) {
          printf("The minimum number of coins is: %d\n", coinsTotal);
      } else {
          while (cents >= nickel) {
            cents = cents - nickel;
            coinsTotal = coinsTotal + 1;
          } if (cents == 0) {
              printf("The minimum number of coins is: %d\n", coinsTotal);
          } else {
              while (cents >= penny) {
                cents = cents - penny;
                coinsTotal = coinsTotal + 1;
              } if (cents == 0) {
                  printf("The minimum number of coins is: %d\n", coinsTotal);
                }
        }
      }
    }
}

Basically it should work out the minimum number of coins needed to make a given amount. It works in most cases until the floats mess up. Excuse the notes I like to write what I did so I learn better.

Update Tried to compile with GCC using -lm but still failed. adam@beethoven:~/projects/atom/edx/pSet1/greedy$ gcc -o foo -lm greedy.c /tmp/cc3qHAK7.o: In function main': greedy.c:(.text+0x6e): undefined reference to ceilf' collect2: error: ld returned 1 exit status adam@beethoven:~/projects/atom/edx/pSet1/greedy$

SOLUTION Instead of using the make command I used gcc and added the -lm flag At the end of the command gcc -o foo greedy.c -lm

I have seen the posts about -lm and a certain file but if I am honest I don't understand what it means.

You have to link to the math library to fix the error. Math functions implementations are usually put as a separate library, the math library. If you use gcc add -lm to the linker command.

I presume you want to round floating numbers to the nearest integer. ceilf is not doing that, it is rounding up. You can use this macro for rounding to nearest long when possible:

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

Also, you get a linking error because you don't link with the math library. For example use :

gcc greedy.c -lm -o greedy

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM