我正在寻找C中ceil()
和floor()
函数的替代方法,因为不允许我在项目中使用它们。
到目前为止,我使用cast
运算符构建了一个棘手的来回方式,并且将浮点值(在我的情况下为double
)转换为int
,然后稍后,因为我需要在给定浮点值上下的最接近整数,也要是double
值,回到double
:
#include <stdio.h>
int main(void)
{
double original = 124.576;
double floorint;
double ceilint;
int f;
int c;
f = (int) original; //Truncation to closest floor integer value
c = f + 1;
floorint = (double) f;
ceilint = (double) c;
printf("Original Value: %f, Floor Int: %f , Ceil Int: %f",original,floorint,ceilint);
}
输出:
Original Value: 124.576000, Floor Int: 124.000000 , Ceil Int: 125.000000
对于此示例,通常我不需要将c
和f
的ceil和floor整数值转换回double
,但在我的真实程序中的double
中需要它们。认为这是任务的要求。
尽管输出提供了所需的值,并且到目前为止看来是正确的,但我仍然担心该方法是否确实正确和适当,或者更明确地说,是此方法是否确实带来了不良行为或问题。该程序,或者如果有其他可能的选择,给我带来与其他选择相比的性能损失。
您知道更好的选择吗?如果是这样,为什么这个应该更好?
非常感谢。
[您缺少重要的步骤:您需要检查数字是否已经为整数,因此对于ceil
,假设非负数字(一般化是微不足道的,请使用类似的方法)>
double ceil(double f){ long long i = (long long)f; return 0.0 + i + (f != (double)i); // to obviate potential long long overflow }
[拼图中的另一个缺失部分是检查
f
是否在long long
的范围内。在常见平台上,如果f
不在long long
的范围内,则它还是必不可少的。