在我的程序中,我需要始终获得大于参数的最接近的整数值。为此,我正在使用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;
}
答案 0 :(得分:3)
正如评论中指出的那样,ceil
返回double
,但如果没有为函数指定原型,编译器必须假定函数返回int
并且参数的类型(在应用default argument promotions之后)与函数参数的类型相同。调用实际函数时,由于参数类型错误(ceil
期望double
但是您传递了int
),行为未定义。
在许多现代系统中,浮点参数和整数值参数甚至不在相同的寄存器中传递。所以在这种情况下,ceil
寻找一个double
参数,可能只发现了浮点数参数寄存器中的垃圾;和调用者,期望int
返回值,只发现整数返回寄存器中发生的任何垃圾。
编译器应该警告你默认调用非原型函数。检查警告,你会避免这些问题。