在 C 中实现 ceil()

2023-12-30

我想实现我自己的ceil() in C。在库中搜索源代码并找到,但似乎很难理解。我想要干净优雅的代码。

我也在SO上搜索,找到了一些答案here https://stackoverflow.com/questions/2796639/implementation-of-ceil-function-in-c。似乎没有一个答案是正确的。答案之一是:

#define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
#define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
#define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )

AFAIK,返回类型ceil()不是整数。宏在这里是类型安全的吗? 此外,上述实现对于负数有效吗?

实施它的最佳方式是什么?

你能提供干净的代码吗?


对于大于的数字,您引用的宏肯定无法正常工作INT_MAX但仍然可以精确地表示为双精度数。

唯一的实现方法ceil()正确地(假设您无法使用等效的汇编指令来实现它)是对浮点数的二进制表示进行位旋转,如在s_ceil.c第一个链接后面的源文件。了解代码的工作原理需要了解底层平台的浮点表示——该表示很可能是IEEE 754 http://en.wikipedia.org/wiki/IEEE_floating_point——但是没有办法解决这个问题。

Edit:

中的一些复杂性s_ceil.c源于它处理的特殊情况(NaN、无穷大)以及它需要在无法假设 64 位整数类型存在的情况下完成其工作的事实。

所有位调整的基本思想是屏蔽尾数的小数位,如果数字大于零,则加 1...但是还涉及一些额外的逻辑,以确保您执行在所有情况下都是正确的事情。

这是一个说明性版本ceil()我拼凑而成的花车。当心:这确实not正确处理特殊情况,并且它没有经过广泛的测试——所以不要实际使用它。然而,它确实有助于说明比特处理所涉及的原理。我尝试对该例程进行广泛的注释,但这些注释确实假设您了解浮点数如何以 IEEE 754 格式表示。

union float_int
{
    float f;
    int i;
};

float myceil(float x)
{
    float_int val;
    val.f=x;

    // Extract sign, exponent and mantissa
    // Bias is removed from exponent
    int sign=val.i >> 31;
    int exponent=((val.i & 0x7fffffff) >> 23) - 127;
    int mantissa=val.i & 0x7fffff;

    // Is the exponent less than zero?
    if(exponent<0) 
    {   
        // In this case, x is in the open interval (-1, 1)
        if(x<=0.0f)
            return 0.0f;
        else
            return 1.0f;
    }
    else
    {
        // Construct a bit mask that will mask off the
        // fractional part of the mantissa
        int mask=0x7fffff >> exponent;

        // Is x already an integer (i.e. are all the
        // fractional bits zero?)
        if((mantissa & mask) == 0)
            return x;
        else
        {
            // If x is positive, we need to add 1 to it
            // before clearing the fractional bits
            if(!sign)
            {
                mantissa+=1 << (23-exponent);

                // Did the mantissa overflow?
                if(mantissa & 0x800000)
                {
                    // The mantissa can only overflow if all the
                    // integer bits were previously 1 -- so we can
                    // just clear out the mantissa and increment
                    // the exponent
                    mantissa=0;
                    exponent++;
                }
            }

            // Clear the fractional bits
            mantissa&=~mask;
        }
    }

    // Put sign, exponent and mantissa together again
    val.i=(sign << 31) | ((exponent+127) << 23) | mantissa;

    return val.f;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中实现 ceil() 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • warning(junit.framework.TestSuite$1): 通过 Maven 执行 Android Test 时构造函数中出现异常

    我通过 Maven 设置了一个 Android 测试项目 并按照以下说明进行操作here http code google com p maven android plugin wiki AutomateAndroidTestProject
  • 如何解析代码以构建 Java 编译器?

    我需要写一个编译器 这是大学的家庭作业 老师告诉我们 我们可以使用任何我们想要的API来进行代码的解析 只要它是好的 这样我们就可以更加关注我们将生成的 JVM 所以是的 我将用 Java 编写一个编译器来生成 Java 你知道有什么好的A
  • 快速播放活动 UITableView 单元格中的视频

    目标 我正在尝试在完全可见的单元格 可能是 2 3 或 1 中播放视频 并且应该以不可见的方式停止cell 我在用UITableview with AVPlayer 我的桌面视图充满了视频列表 目前我正在使用捆绑包中的视频 我使用了下面的代
  • Sybase 令牌数据流长度不正确

    将二进制文件保存到图像列时出现以下错误 org springframework jdbc UncategorizedSQLException PreparedStatementCallback SQL 的未分类 SQLException 插
  • 如何将 DataSnap 客户端连接定向到各种 DS Server?

    我有一个相当大的 DataSnap 服务器 它将 24 7 运行 它将替代当前运行的 MIDAS COM 服务器 现在我面临的问题是如何更新该服务器而不必强制断开所有连接的客户端 使用当前的 midas 服务器 顺便说一下 没有大量的流量可
  • 将某些工作表从 Excel 工作簿导出为 PDF

    我正在编写一个 VBA 代码 将 Excel 中的一些工作表导出到同一个 PDF 我的 Excel 文件中有几个图表工作表 每个图表工作表的名称都以 name Chart 结尾 我想将名称以图表结尾的所有工作表导出到一个 PDF 文件 这是
  • 在 C/C++ 中获取大随机数

    标准rand 函数给出的数字对我来说不够大 我需要unsigned long long那些 我们如何获得非常大的随机数 我尝试修改一个简单的哈希函数 但它太big 运行时间太长 并且永远不会产生小于 1e5 的数字 你可以轻松地做到这一点s
  • Android 自定义 Widget 膨胀异常

    XML
  • 自定义 li 列表样式,带有很棒的字体图标

    我想知道是否可以利用 font awesome 或任何其他标志性字体 类来创建自定义 li 列表样式类型 我目前正在使用 jQuery 来执行此操作 即 li myClass prepend i class i 然而 当 li li 文本环
  • POST Restful API 的响应代码 400 或 403

    我正在设计一个 POST Restful API 在这种情况下 我必须根据请求正文中提供的元素之一来授权用户 例如 division 1 name MyName address no 123 street abc pincode 22211
  • Minimongo 尚不支持投影中的 $ 运算符

    我有这个文件 username torayeff profile friends id aSD4wmMEsFnYLcvmP state active id ShFTXxuQLAxWCh4cq state active id EQjoKMNB
  • 如何在android的WebView中显示滚动条

    是否可以在 android 的 WebView 中显示可滚动 html 元素的滚动条 怎么做 in your onCreate 方法 试试这个 Override public void onCreate Bundle savedInstan
  • ASP.NET Web API JSON 输出中没有时间的日期

    有没有一种简单的方法来配置 JSON NET 以便some DateTime字段将被格式化 没有时间和其他DateTime字段仍会随时间格式化吗 例子 firstName John lastName Doe birthday 1965 09
  • vbscript 调试器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个可以在开发中使用的 vbscript 但不能在服务器上使用 我想调试这个 但我不想在服务器上安
  • 当我们使用rest api进行调用时,我们在该url参数上使用什么twiml

    我正在使用其余 api 创建呼叫 try Initiate a new outbound call call this gt client gt calls gt create to call num2 Step 5 Change the
  • 是否有可能伪造 Windows 控制台 api?

    我用 C 编写了一个 ssh 服务器 我认为将 powershell 作为 shell 连接起来会很漂亮 我尝试了两种方法来使其正常工作 但这两种方法都远非完美 这是我尝试过的 启动 powershell exe 并将其重定向到 std i
  • Elasticsearch批量索引超时错误!错误:30000 毫秒后请求超时

    最近 我想将旧的指数数据滚动到新的月度指数 存储的数据从2015 07开始至今 每个月几乎有30 000条记录 跟着scroll and bulk中提供的方法2 2 API https www elastic co guide en ela
  • 在 PHP 中处理大量数据

    To use 模幂 http en wikipedia org wiki Modular exponentiation正如您在使用时所需要的费马素性测试 http en wikipedia org wiki Fermat primality
  • 如何在 LARAVEL 5.2 中将数据存储到数据库

    我是 Laravel 的初学者 当我想将数据存储到数据库时遇到问题 当视图上的名称与数据库上的字段名称不同时 数据未保存在数据库中 但当视图上的输入名称与数据库上的字段名称相同时 数据已正确存储 例子 这是视图 div class form
  • 在 C 中实现 ceil()

    我想实现我自己的ceil in C 在库中搜索源代码并找到 但似乎很难理解 我想要干净优雅的代码 我也在SO上搜索 找到了一些答案here https stackoverflow com questions 2796639 implemen