ceil()和floor()的替代,以获取最接近的浮点值上下的整数值?

问题描述 投票:0回答:1

我正在寻找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 

对于此示例,通常我不需要将cf的ceil和floor整数值转换回double,但在我的真实程序中的double中需要它们。认为这是任务的要求。


尽管输出提供了所需的值,并且到目前为止看来是正确的,但我仍然担心该方法是否确实正确和适当,或者更明确地说,是此方法是否确实带来了不良行为或问题。该程序,或者如果有其他可能的选择,给我带来与其他选择相比的性能损失。


您知道更好的选择吗?如果是这样,为什么这个应该更好?

非常感谢。

c algorithm floor ceil
1个回答
0
投票

[您缺少重要的步骤:您需要检查数字是否已经为整数,因此对于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的范围内,则它还是必不可少的。

© www.soinside.com 2019 - 2024. All rights reserved.