首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ceil和整数的使用

Ceil和整数的使用
EN

Stack Overflow用户
提问于 2014-09-29 17:54:30
回答 2查看 2.3K关注 0票数 3

所以我刚从一个成绩很好的学校项目中得到了成绩,但是成绩下降了5分,因为我没有打电话给赛尔(.)。这是一个使用CUDA的并行计算课程,但这个问题与任何CUDA功能没有直接关系。

以下是“冒犯”的字句:

代码语言:javascript
复制
dim3 dimGrid(n / dimBlock.x, n / dimBlock.y);

他说我应该这样做:

代码语言:javascript
复制
dim3 dimGrid(ceil(n / dimBlock.x), ceil(n / dimBlock.y));

所以我的问题是,如果n和is块是整数,为什么要标记它呢?它们的结果将在ceil被调用和截断之前进行计算。因此,为此划上记号似乎是愚蠢的。

下面的例子似乎表明GCC在使用-O2时仍然优化了调用。

与赛尔:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

int main()
{
        int m = 3, n = 5, o;

        o = ceil(n / m);
        printf("%d\n", o);
        return 0;
}

没有:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

int main()
{
        int m = 3, n = 5, o;

        o = n / m;
        printf("%d\n", o);
        return 0;
}

虽然我只明白其中的5点,但如果我完全错了,我仍然想知道为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-30 13:53:30

分级可能意味着您需要使用分数n/d的上限,这是完全正确的:这样就有足够的块覆盖n,最后一个块可能是不完整的。

这并不意味着适当的实现是使用C表达式ceil(n/d)。实际上,C /是一个整数除法,它将丢弃小数部分,实际上是小数的一部分。

您可以使用ceil((double)n/(double)d)代替。

但我最喜欢的方式是不用转换成双打:(n+d-1)/d

票数 5
EN

Stack Overflow用户

发布于 2014-09-29 18:01:59

这里,m= 3,n=5 so,n/m=1.67(大约);由于您将它赋值o为int类型,它将截断它。也就是说,只存储整数部分而不是十进制部分,因此我们有o=1。如果要使用ceil(n/m),输出将为2,然后将输出分配给o,即o=2。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26105925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档