2017-05-01 38 views
-1

在我的程序中,我需要总是得到大于参数的最接近的整数值。为此,我使用C ceil()函数。 问题是它总是返回数字,我不期待。C ceil()函数返回奇怪的数字

E.g.

double num = 1/25.0; // num is correctly 0.04(some 0s)1 
ceil(num);    // ceil returns 1018 

早些时候在我的节目我打电话srand(time(NULL)),所以我想也许这有事情做与它和我评论它,但它并没有帮助。

当我调用像这样的函数ceil(0.040000001)时,它也返回1018。 即使我用文档中的参数调用函数,它也有这种奇怪的行为。

示例程序

//#include <stdio.h> 
//#include <stdlib.h> 

int main() { 

    //double var = 1/25.0; 
    double num1 = ceil(1.6); // returns 1023 

    return 0; 
} 
+7

我们需要一个[mcve] – tkausl

+2

*您如何检查返回值? – UnholySheep

+6

你是否包含math.h?如果没有正确的原型C假定'int ceil(int);' –

回答

3

正如在评论中指出,ceil返回double,但如果你没有指定一个函数原型,编译器必须假定该函数返回int和类型(在应用default argument promotions之后)的参数与函数参数的类型相同。当调用实际功能时,由于参数类型错误(ceil需要double,但您通过了int),因此行为未定义。

在许多现代系统中,浮点参数和整数值参数甚至不会在同一个寄存器中传递。所以很可能在这种情况下,寻找double参数的ceil只能找到发生在浮点参数寄存器中的任何垃圾;和调用者,期待int返回值,只发现垃圾发生在整数返回寄存器中。

编译器应该默认警告你调用未原型函数。检查警告,你会避免这样的问题。

+2

在寄存器丰富的体系结构(如x64)中,更有可能浮点数和整数在不同的寄存器中传递,因此'ceil'看着错误放置参数并获取浮点寄存器中发生的任何垃圾,并且您正在寻找返回值的错误位置,并获取整数寄存器中发生的任何垃圾。因此,返回的值与您传递的值之间不必有任何关联。 – trentcl

+0

@trentcl由于答案是社区wiki,因此无需评论。您可以编辑和改进答案。 – chux