【问题标题】:Implementation of ceil function in CC语言中ceil函数的实现
【发布时间】:2015-01-27 14:34:21
【问题描述】:

我有两个关于ceil()函数的问题..

  1. ceil() 函数是用 C 实现的。如果我使用 ceil(3/2),它可以正常工作。但是当我使用ceil(count/2)时,如果count的值为3,则编译时出错。

    /tmp/ccA4Yj7p.o(.text+0x364): 在函数FrontBackSplit': : undefined reference toceil' collect2: ld 返回 1 退出状态

    在第二种情况下如何使用ceil函数?请提出建议。

  2. 如何在 C 中实现我自己的 ceil 函数。请给出一些基本指南。

谢谢。

【问题讨论】:

  • ceil(3/2) = 1.0, ceil(3/2.0) = 2.0 -- 看看你能不能找出原因...

标签: c ceil


【解决方案1】:

试试这个:

#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) )

查看 cmets、证明和讨论的链接: http://www.linuxquestions.org/questions/programming-9/ceiling-function-c-programming-637404/

【讨论】:

  • 这对于负值是不正确的:上限总是返回大于或等于给定参数的最小整数(对于负数,这意味着朝向零而不是远离)。
  • 测试测试再测试。 ceil(-6.2) 为 -6。宏给出-7。错了。
【解决方案2】:

ceil() 函数在数学库 libm.so 中实现。默认情况下,当通过 gcc 前端调用时,链接器不会链接到这个库。要链接到该库,请将命令行上的 -lm 传递给 gcc:

gcc main.c -lm

【讨论】:

  • 请注意,并非所有平台都如此。有些平台不需要链接到 libm 来获取数学函数。
  • 嗨,这对我来说很好用.. 谢谢.. 这个参数 -lm 是什么?
  • @RBA,“-lm”表示链接库“libm.so”或“libm.dylib”或“m.dll”,具体取决于您的平台。
  • 感谢亚当的回答。我也有同样的问题。
【解决方案3】:

ceil函数的原型是:

double ceil(double)

我的猜测是你的变量 count 的类型不是 double 类型。要在 C 中使用 ceil,您可以编写:

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

在 C++ 中,您可以使用 中的std::ceil; std::ceil 被重载以支持多种类型:

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

【讨论】:

    【解决方案4】:
    double ceil (double x) {
        if (x > LONG_MAX) return x; // big floats are all ints
        return ((long)(x+(0.99999999999999997)));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2011-05-09
      • 2013-11-25
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多