C ceil()函数返回奇怪的数字

时间:2017-05-01 15:21:46

标签: c

在我的程序中,我需要始终获得大于参数的最接近的整数值。为此,我正在使用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;
}

1 个答案:

答案 0 :(得分:3)

正如评论中指出的那样,ceil返回double,但如果没有为函数指定原型,编译器必须假定函数返回int并且参数的类型(在应用default argument promotions之后)与函数参数的类型相同。调用实际函数时,由于参数类型错误(ceil期望double但是您传递了int),行为未定义。

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

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