我需要将两个数字分开并将其四舍五入.有没有更好的方法来做到这一点?
int myValue = (int) ceil( (float)myIntNumber / myOtherInt );
Run Code Online (Sandbox Code Playgroud)
我发现不得不投两个不同的时间.(extern int cast只是为了关闭警告)
注意我必须内部转换才能浮动
int a = ceil(256/11); //> Should be 24, but it is 23
^example
Run Code Online (Sandbox Code Playgroud)
jwo*_*der 19
假设这两个myIntNumber和myOtherInt是积极的,你可以这样做:
int myValue = (myIntNumber + myOtherInt - 1) / myOtherInt;
Run Code Online (Sandbox Code Playgroud)
在DyP的帮助下,提出了以下无分支公式:
int idiv_ceil ( int numerator, int denominator )
{
return numerator / denominator
+ (((numerator < 0) ^ (denominator > 0)) && (numerator%denominator));
}
Run Code Online (Sandbox Code Playgroud)
它避免了浮点转换并传递了一套基本的单元测试,如下所示:
这是避免模运算符的另一个版本.
int idiv_ceil ( int numerator, int denominator )
{
int truncated = numerator / denominator;
return truncated + (((numerator < 0) ^ (denominator > 0)) &&
(numerator - truncated*denominator));
}
Run Code Online (Sandbox Code Playgroud)
第一个会比较快在哪里IDIV同时返回商和余数(和编译器是足够聪明的使用)处理器.
由于答案中显示了很多不同的方法,并且没有一个答案实际上证明了性能方面的任何优势,因此我尝试自己对它们进行基准测试。我的计划是写一个答案,其中包含一个简短的表格和一个确定的答案,哪种方法最快。
\n不幸的是事情没那么简单。(从来都不是。)舍入公式的性能似乎取决于所使用的数据类型、编译器和优化级别。
\n在一种情况下,从一种方法到另一种方法,速度提高了 7.5\xc3\x97。因此,对于某些人来说,影响可能很大。
\n对于long整数,使用类型转换为floatand的简单版本std::ceil实际上是最快的。这对我个人来说很有趣,因为我打算将它与size_t通常定义为unsigned long.
对于普通的int,这取决于你的优化级别。对于较低级别的 @Jwodder\'s 解决方案表现最好。对于最高级别来说std::ceil是最佳的。但有一个例外:对于 clang/unsigned int组合 @Jwodder 来说仍然更好。
已接受答案的解决方案从未真正优于其他两个。但您应该记住,@Jwodder 的解决方案不适用于底片。
\n结果在底部。
\n回顾一下我进行基准测试和比较的四种方法:
\ntemplate<typename T>\ninline T divCeilJwodder(const T& numerator, const T& denominator)\n{\n return (numerator + denominator - 1) / denominator;\n}\nRun Code Online (Sandbox Code Playgroud)\ntemplate<typename T>\ninline T divCeilVoigtModulo(const T& numerator, const T& denominator)\n{\n return numerator / denominator + (((numerator < 0) ^ (denominator > 0))\n && (numerator%denominator));\n}\nRun Code Online (Sandbox Code Playgroud)\ninline T divCeilVoigtNoModulo(const T& numerator, const T& denominator)\n{\n T truncated = numerator / denominator;\n return truncated + (((numerator < 0) ^ (denominator > 0))\n && (numerator - truncated*denominator));\n}\nRun Code Online (Sandbox Code Playgroud)\ntemplate<typename T>\ninline T divCeilTypeCast(const T& numerator, const T& denominator)\n{\n return (int)std::ceil((double)numerator / denominator);\n}\nRun Code Online (Sandbox Code Playgroud)\n在单个批次中,除法执行了 1 亿次。针对编译器/优化级别、使用的数据类型和使用的实现的每个组合计算十个批次。下面显示的值是所有 10 个批次的平均值(以毫秒为单位)。给出的误差是标准差。
\n所使用的整个源代码可以在这里找到。此外,您可能会发现此脚本很有用,它可以使用不同的编译器标志编译和执行源代码。
\n整个基准测试是在 i7-7700K 上执行的。使用的编译器版本是GCC 10.2.0和clang 11.0.1。
\n现在,不用多说,结果如下:
\nDataType算法 | 海湾合作委员会 -O0 | -O1 | -氧气 | -O3 | -Os | -奥法斯特 | -Og | 铿锵 -O0 | -O1 | -氧气 | -O3 | -奥法斯特 | -Os | -Oz |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
unsigned | ||||||||||||||
| 杰沃德 | 264.1\xc2\xa0\xc2\xb1\xc2\xa00.9 \xc2\xa0 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.9 \xc2\xa0 | 153.5\xc2\xa0\xc2\xb1\xc2\xa00.7 \xc2\xa0 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 | 153.3\xc2\xa0\xc2\xb1\xc2\xa00.5 | 153.4\xc2\xa0\xc2\xb1\xc2\xa00.8 | 175.5\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 | 329.4\xc2\xa0\xc2\xb1\xc2\xa01.3 \xc2\xa0 | 220.0\xc2\xa0\xc2\xb1\xc2\xa01.3 \xc2\xa0 | 146.2\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 | 146.2\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 | 146.0\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 | 153.2\xc2\xa0\xc2\xb1\xc2\xa00.3 \xc2\xa0 | 153.5\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 |
| 福格特模数 | 528.5\xc2\xa0\xc2\xb1\xc2\xa02.5 | 306.5\xc2\xa0\xc2\xb1\xc2\xa01.0 | 175.8\xc2\xa0\xc2\xb1\xc2\xa00.7 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 | 175.6\xc2\xa0\xc2\xb1\xc2\xa00.7 | 175.4\xc2\xa0\xc2\xb1\xc2\xa00.6 | 352.0\xc2\xa0\xc2\xb1\xc2\xa01.0 | 588.9\xc2\xa0\xc2\xb1\xc2\xa06.4 | 408.7\xc2\xa0\xc2\xb1\xc2\xa01.5 | 164.8\xc2\xa0\xc2\xb1\xc2\xa01.0 | 164.0\xc2\xa0\xc2\xb1\xc2\xa00.4 | 164.1\xc2\xa0\xc2\xb1\xc2\xa00.4 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.5 | 175.8\xc2\xa0\xc2\xb1\xc2\xa00.9 |
| Voigt无模 | 375.3\xc2\xa0\xc2\xb1\xc2\xa01.5 | 175.7\xc2\xa0\xc2\xb1\xc2\xa01.3 \xc2\xa0 | 192.5\xc2\xa0\xc2\xb1\xc2\xa01.4 | 197.6\xc2\xa0\xc2\xb1\xc2\xa01.9 | 200.6\xc2\xa0\xc2\xb1\xc2\xa07.2 | 176.1\xc2\xa0\xc2\xb1\xc2\xa01.5 | 197.9\xc2\xa0\xc2\xb1\xc2\xa00.5 | 541.0\xc2\xa0\xc2\xb1\xc2\xa01.8 | 263.1\xc2\xa0\xc2\xb1\xc2\xa00.9 | 186.4\xc2\xa0\xc2\xb1\xc2\xa00.6 | 186.4\xc2\xa0\xc2\xb1\xc2\xa01.2 | 187.2\xc2\xa0\xc2\xb1\xc2\xa01.1 | 197.2\xc2\xa0\xc2\xb1\xc2\xa00.8 | 197.1\xc2\xa0\xc2\xb1\xc2\xa00.7 |
| 类型转换 | 348.5\xc2\xa0\xc2\xb1\xc2\xa02.7 | 231.9\xc2\xa0\xc2\xb1\xc2\xa03.9 | 234.4\xc2\xa0\xc2\xb1\xc2\xa01.3 | 226.6\xc2\xa0\xc2\xb1\xc2\xa01.0 | 137.5\xc2\xa0\xc2\xb1\xc2\xa00.8 \xc2\xa0 | 138.7\xc2\xa0\xc2\xb1\xc2\xa01.7 \xc2\xa0 | 243.8\xc2\xa0\xc2\xb1\xc2\xa01.4 | 591.2\xc2\xa0\xc2\xb1\xc2\xa02.4 | 591.3\xc2\xa0\xc2\xb1\xc2\xa02.6 | 155.8\xc2\xa0\xc2\xb1\xc2\xa01.9 | 155.9\xc2\xa0\xc2\xb1\xc2\xa01.6 | 155.9\xc2\xa0\xc2\xb1\xc2\xa02.4 | 214.6\xc2\xa0\xc2\xb1\xc2\xa01.9 | 213.6\xc2\xa0\xc2\xb1\xc2\xa01.1 |
unsigned long | ||||||||||||||
| 杰沃德 | 658.6\xc2\xa0\xc2\xb1\xc2\xa02.5 | 546.3\xc2\xa0\xc2\xb1\xc2\xa00.9 | 549.3\xc2\xa0\xc2\xb1\xc2\xa01.8 | 549.1\xc2\xa0\xc2\xb1\xc2\xa02.8 | 540.6\xc2\xa0\xc2\xb1\xc2\xa03.4 | 548.8\xc2\xa0\xc2\xb1\xc2\xa01.3 | 486.1\xc2\xa0\xc2\xb1\xc2\xa01.1 | 638.1\xc2\xa0\xc2\xb1\xc2\xa01.8 | 613.3\xc2\xa0\xc2\xb1\xc2\xa02.1 | 190.0\xc2\xa0\xc2\xb1\xc2\xa00.8 \xc2\xa0 | 182.7\xc2\xa0\xc2\xb1\xc2\xa00.5 | 182.4\xc2\xa0\xc2\xb1\xc2\xa00.5 | 496.2\xc2\xa0\xc2\xb1\xc2\xa01.3 | 554.1\xc2\xa0\xc2\xb1\xc2\xa01.0 |
| 福格特模数 | 1,169.0\xc2\xa0\xc2\xb1\xc2\xa02.9 | 1,015.9\xc2\xa0\xc2\xb1\xc2\xa04.4 | 550.8\xc2\xa0\xc2\xb1\xc2\xa02.0 | 504.0\xc2\xa0\xc2\xb1\xc2\xa01.4 | 550.3\xc2\xa0\xc2\xb1\xc2\xa01.2 | 550.5\xc2\xa0\xc2\xb1\xc2\xa01.3 | 1,020.1\xc2\xa0\xc2\xb1\xc2\xa02.9 | 1,259.0\xc2\xa0\xc2\xb1\xc2\xa09.0 | 1,136.5\xc2\xa0\xc2\xb1\xc2\xa04.2 | 187.0\xc2\xa0\xc2\xb1\xc2\xa03.4 \xc2\xa0 | 199.7\xc2\xa0\xc2\xb1\xc2\xa06.1 | 197.6\xc2\xa0\xc2\xb1\xc2\xa01.0 | 549.4\xc2\xa0\xc2\xb1\xc2\xa01.7 | 506.8\xc2\xa0\xc2\xb1\xc2\xa04.4 |
| Voigt无模 | 768.1\xc2\xa0\xc2\xb1\xc2\xa01.7 | 559.1\xc2\xa0\xc2\xb1\xc2\xa01.8 | 534.4\xc2\xa0\xc2\xb1\xc2\xa01.6 | 533.7\xc2\xa0\xc2\xb1\xc2\xa01.5 | 559.5\xc2\xa0\xc2\xb1\xc2\xa01.7 | 534.3\xc2\xa0\xc2\xb1\xc2\xa01.5 | 571.5\xc2\xa0\xc2\xb1\xc2\xa01.3 | 879.5\xc2\xa0\xc2\xb1\xc2\xa010.8 | 617.8\xc2\xa0\xc2\xb1\xc2\xa02.1 | 223.4\xc2\xa0\xc2\xb1\xc2\xa01.3 | 231.3\xc2\xa0\xc2\xb1\xc2\xa01.3 | 231.4\xc2\xa0\xc2\xb1\xc2\xa01.1 | 594.6\xc2\xa0\xc2\xb1\xc2\xa01.9 | 572.2\xc2\xa0\xc2\xb1\xc2\xa00.8 |
| 类型转换 | 353.3\xc2\xa0\xc2\xb1\xc2\xa02.5 \xc2\xa0 | 267.5\xc2\xa0\xc2\xb1\xc2\xa01.7 \xc2\xa0 | 248.0\xc2\xa0\xc2\xb1\xc2\xa01.6 \xc2\xa0 | 243.8\xc2\xa0\xc2\xb1\xc2\xa01.2 \xc2\xa0 | 154.2\xc2\xa0\xc2\xb1\xc2\xa00.8 \xc2\xa0 | 154.1\xc2\xa0\xc2\xb1\xc2\xa01.0 \xc2\xa0 | 263.8\xc2\xa0\xc2\xb1\xc2\xa01.8 \xc2\xa0 | 365.5\xc2\xa0\xc2\xb1\xc2\xa01.6 \xc2\xa0 | 316.9\xc2\xa0\xc2\xb1\xc2\xa01.8 \xc2\xa0 | 189.7\xc2\xa0\xc2\xb1\xc2\xa02.1 \xc2\xa0 | 156.3\xc2\xa0\xc2\xb1\xc2\xa01.8 \xc2\xa0 | 157.0\xc2\xa0\xc2\xb1\xc2\xa02.2 \xc2\xa0 | 155.1\xc2\xa0\xc2\xb1\xc2\xa00.9 \xc2\xa0 | 176.5\xc2\xa0\xc2\xb1\xc2\xa01.2 \xc2\xa0 |
int | ||||||||||||||
| 杰沃德 | 307.9\xc2\xa0\xc2\xb1\xc2\xa01.3 \xc2\xa0 | 175.4\xc2\xa0\xc2\xb1\xc2\xa00.9 \xc2\xa0 | 175.3\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 | 175.4\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.5 | 175.1\xc2\xa0\xc2\xb1\xc2\xa00.6 | 175.1\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 | 307.4\xc2\xa0\xc2\xb1\xc2\xa01.2 \xc2\xa0 | 219.6\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 | 146.0\xc2\xa0\xc2\xb1\xc2\xa00.3 \xc2\xa0 | 153.5\xc2\xa0\xc2\xb1\xc2\xa00.5 | 153.6\xc2\xa0\xc2\xb1\xc2\xa00.8 | 175.4\xc2\xa0\xc2\xb1\xc2\xa00.7 \xc2\xa0 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 |
| 福格特模数 | 528.5\xc2\xa0\xc2\xb1\xc2\xa01.9 | 351.9\xc2\xa0\xc2\xb1\xc2\xa04.6 | 175.3\xc2\xa0\xc2\xb1\xc2\xa00.6 \xc2\xa0 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.4 \xc2\xa0 | 197.1\xc2\xa0\xc2\xb1\xc2\xa00.6 | 175.2\xc2\xa0\xc2\xb1\xc2\xa00.8 | 373.5\xc2\xa0\xc2\xb1\xc2\xa01.1 | 598.7\xc2\xa0\xc2\xb1\xc2\xa05.1 | 460.6\xc2\xa0\xc2\xb1\xc2\xa01.3 | 175.4\xc2\xa0\xc2\xb1\xc2\xa00.4 | 164.3\xc2\xa0\xc2\xb1\xc2\xa00.9 | 164.0\xc2\xa0\xc2\xb1\xc2\xa00.4 | 176.3\xc2\xa0\xc2\xb1\xc2\xa01.6 \xc2\xa0 | 460.0\xc2\xa0\xc2\xb1\xc2\xa00.8 |
| Voigt无模 | 398.0\xc2\xa0\xc2\xb1\xc2\xa02.5 | 241.0\xc2\xa0\xc2\xb1\xc2\xa00.7 | 199.4\xc2\xa0\xc2\xb1\xc2\xa05.1 | 219.2\xc2\xa0\xc2\xb1\xc2\xa01.0 | 175.9\xc2\xa0\xc2\xb1\xc2\xa01.2 | 197.7\xc2\xa0\xc2\xb1\xc2\xa01.2 | 242.9\xc2\xa0\xc2\xb1\xc2\xa03.0 | 543.5\xc2\xa0\xc2\xb1\xc2\xa02.3 | 350.6\xc2\xa0\xc2\xb1\xc2\xa01.0 | 186.6\xc2\xa0\xc2\xb1\xc2\xa01.2 | 185.7\xc2\xa0\xc2\xb1\xc2\xa00.3 | 186.3\xc2\xa0\xc2\xb1\xc2\xa01.1 | 197.1\xc2\xa0\xc2\xb1\xc2\xa00.6 | 373.3\xc2\xa0\xc2\xb1\xc2\xa01.6 |
| 类型转换 | 338.8\xc2\xa0\xc2\xb1\xc2\xa04.9 | 228.1\xc2\xa0\xc2\xb1\xc2\xa00.9 | 230.3\xc2\xa0\xc2\xb1\xc2\xa00.8 | 229.5\xc2\xa0\xc2\xb1\xc2\xa09.4 | 153.8\xc2\xa0\xc2\xb1\xc2\xa00.4 \xc2\xa0 | 138.3\xc2\xa0\xc2\xb1\xc2\xa01.0 \xc2\xa0 | 241.1\xc2\xa0\xc2\xb1\xc2\xa01.1 | 590.0\xc2\xa0\xc2\xb1\xc2\xa02.1 | 589.9\xc2\xa0\xc2\xb1\xc2\xa00.8 | 155.2\xc2\xa0\xc2\xb1\xc2\xa02.4 | 149.4\xc2\xa0\xc2\xb1\xc2\xa01.6 \xc2\xa0 | 148.4\xc2\xa0\xc2\xb1\xc2\xa01.2 \xc2\xa0 | 214.6\xc2\xa0\xc2\xb1\xc2\xa02.2 | 211.7\xc2\xa0\xc2\xb1\xc2\xa01.6 |
long | ||||||||||||||
| 杰沃德 | 758.1\xc2\xa0\xc2\xb1\xc2\xa01.8 | 600.6\xc2\xa0\xc2\xb1\xc2\xa00.9 | 601.5\xc2\xa0\xc2\xb1\xc2\xa02.2 | 601.5\xc2\xa0\xc2\xb1\xc2\xa02.8 | 581.2\xc2\xa0\xc2\xb1\xc2\xa01.9 | 600.6\xc2\xa0\xc2\xb1\xc2\xa01.8 | 586.3\xc2\xa0\xc2\xb1\xc2\xa03.6 | 745.9\xc2\xa0\xc2\xb1\xc2\xa03.6 | 685.8\xc2\xa0\xc2\xb1\xc2\xa02.2 | 183.1\xc2\xa0\xc2\xb1\xc2\xa01.0 | 182.5\xc2\xa0\xc2\xb1\xc2\xa00.5 | 182.6\xc2\xa0\xc2\xb1\xc2\xa00.6 | 553.2\xc2\xa0\xc2\xb1\xc2\xa01.5 | 488.0\xc2\xa0\xc2\xb1\xc2\xa00.8 |
| 福格特模数 | 1,360.8\xc2\xa0\xc2\xb1\xc2\xa06.1 | 1,202.0\xc2\xa0\xc2\xb1\xc2\xa02.1 | 600.0\xc2\xa0\xc2\xb1\xc2\xa02.4 | 600.0\xc2\xa0\xc2\xb1\xc2\xa03.0 | 607.0\xc2\xa0\xc2\xb1\xc2\xa06.8 | 599.0\xc2\xa0\xc2\xb1\xc2\xa01.6 | 1,187.2\xc2\xa0\xc2\xb1\xc2\xa02.6 | 1,439.6\xc2\xa0\xc2\xb1\xc2\xa06.7 | 1,346.5\xc2\xa0\xc2\xb1\xc2\xa02.9 | 197.9\xc2\xa0\xc2\xb1\xc2\xa00.7 | 208.2\xc2\xa0\xc2\xb1\xc2\xa00.6 | 208.0\xc2\xa0\xc2\xb1\xc2\xa00.4 | 548.9\xc2\xa0\xc2\xb1\xc2\xa01.4 | 1,326.4\xc2\xa0\xc2\xb1\xc2\xa03.0 |
| Voigt无模 | 844.5\xc2\xa0\xc2\xb1\xc2\xa06.9 | 647.3\xc2\xa0\xc2\xb1\xc2\xa01.3 | 628.9\xc2\xa0\xc2\xb1\xc2\xa01.8 | 627.9\xc2\xa0\xc2\xb1\xc2\xa01.6 | 629.1\xc2\xa0\xc2\xb1\xc2\xa02.4 | 629.6\xc2\xa0\xc2\xb1\xc2\xa04.4 | 668.2\xc2\xa0\xc2\xb1\xc2\xa02.7 | 1,019.5\xc2\xa0\xc2\xb1\xc2\xa03.2 | 715.1\xc2\xa0\xc2\xb1\xc2\xa08.2 | 224.3\xc2\xa0\xc2\xb1\xc2\xa04.8 | 219.0\xc2\xa0\xc2\xb1\xc2\xa01.0 | 219.0\xc2\xa0\xc2\xb1\xc2\xa00.6 | 561.7\xc2\xa0\xc2\xb1\xc2\xa02.5 | 769.4\xc2\xa0\xc2\xb1\xc2\xa09.3 |
| 类型转换 | 366.1\xc2\xa0\xc2\xb1\xc2\xa00.8 \xc2\xa0 | 246.2\xc2\xa0\xc2\xb1\xc2\xa01.1 \xc2\xa0 | 245.3\xc2\xa0\xc2\xb1\xc2\xa01.8 \xc2\xa0 | 244.6\xc2\xa0\xc2\xb1\xc2\xa01.1 \xc2\xa0 | 154.6\xc2\xa0\xc2\xb1\xc2\xa01.6 \xc2\xa0 | 154.3\xc2\xa0\xc2\xb1\xc2\xa00.5 \xc2\xa0 | 257.4\xc2\xa0\xc2\xb1\xc2\xa01.5 \xc2\xa0 | 591.8\xc2\xa0\xc2\xb1\xc2\xa04.1 \xc2\xa0 | 590.4\xc2\xa0\xc2\xb1\xc2\xa01.3 \xc2\xa0 | 154.5\xc2\xa0\xc2\xb1\xc2\xa01.3 \xc2\xa0 | 135.4\xc2\xa0\xc2\xb1\xc2\xa08.3 \xc2\xa0 | 132.9\xc2\xa0\xc2\xb1\xc2\xa00.7 \xc2\xa0 | 132.8\xc2\xa0\xc2\xb1\xc2\xa01.2 \xc2\xa0 | 177.4\xc2\xa0\xc2\xb1\xc2\xa02.3 \xc2\xa0 |
现在我终于可以继续我的生活了:P
\n