2010-05-09 5 views
4

J'ai deux questions concernant ceil() fonction ..La mise en œuvre de la fonction Ceil en C

  1. La fonction ceil() est implémenté en C. Si je ceil(3/2), il fonctionne très bien. Mais quand j'utilise ceil(count/2), si la valeur de count est 3, alors cela donne une erreur de compilation.

    /tmp/ccA4Yj7p.o(.text+0x364): En fonction FrontBackSplit': : undefined reference to Ceil » collect2: ld retour 1 état de sortie

    Comment utiliser la fonction Ceil en second cas? Veuillez suggérer.

  2. Comment puis-je implémenter ma propre fonction de plafond en C. Veuillez donner quelques directives de base.

Merci.

+1

Ceil (3/2) = 1.0, ceil (3/2.0) = 2.0 - voyez si vous pouvez comprendre pourquoi ... –

Répondre

3

La fonction ceil() est implémentée dans la bibliothèque mathématique, libm.so. Par défaut, l'éditeur de liens ne se connecte pas à cette bibliothèque lorsqu'il est appelé via l'interface gcc. Pour créer un lien contre cette bibliothèque, passer -lm sur la ligne de commande gcc:

gcc main.c -lm 
+1

Notez que ceci n'est pas vrai sur toutes les plateformes. Certaines plates-formes ne nécessitent pas de liaison avec libm pour obtenir des fonctions mathématiques. –

+0

Salut cela fonctionne bien pour moi .. Merci .. Quel est ce paramètre -lm? – AGeek

+0

@RBA, "-lm" signifie lier à la bibliothèque "libm.so" ou "libm.dylib" ou "m.dll", selon votre plate-forme. –

3

Le prototype de la fonction ceil est:

double ceil(double) 

Je pense que le type de votre variable count n'est pas de tapez double. Pour utiliser Ceil en C, vous pouvez écrire:

#include <math.h> 
// ... 
double count = 3.0; 
double result = ceil(count/2.0); 

En C++, vous pouvez utiliser std::ceil de <cmath>; std :: ceil est surchargé pour prendre en charge plusieurs types:

#include <cmath> 
// ... 
double count = 3.0; 
double result = std::ceil(count/2.0); 
+0

Non, Il donne toujours la même erreur ... – AGeek

5

Essayez ceci:

#define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X)) 
#define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X)) 
#define CEILING(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X)) 

Consultez le lien pour les commentaires, la preuve et la discussion: http://www.linuxquestions.org/questions/programming-9/ceiling-function-c-programming-637404/

+2

Ceci est incorrect pour les valeurs négatives: plafond renvoie toujours le plus petit entier ** supérieur à ** ou égal à l'argument donné (qui pour les nombres négatifs signifie vers zéro plutôt que loin) . –

+0

Test de test et test à nouveau. ceil (-6,2) est -6. Les macros donnent -7. C'est faux. – carveone

+0

Cela fonctionne bien pour les positifs, merci! – Pithikos

-1
double ceil (double x) { 
    if (x > LONG_MAX) return x; // big floats are all ints 
    return ((long)(x+(0.99999999999999997))); 
} 
+0

Votre fonction semble buggée et sujette aux erreurs. – Matth