余数整除的C++确定性
C++ certainity of Integer Division with remainder
我有一个关于用C/C++中的整数余数进行除法的问题。据说,在两个整数之间的除法运算中,如果结果不能表示为整数,则其非整数部分将以十进制形式删除。例如,int a=17;a/=3/pseudo-float a,得到的值为5.6666。/因此结果为5。由于点(6666..)之后的部分实际上是余数(2)除以3,这是算术中同时用余数进行正常除法的结果。这对我的compter有效,但它绝对可靠吗?还是为了安全起见,我必须用float声明,然后用floor转换为int?哪个对性能和安全更好?提前谢谢。
C++中对整数的算术运算不依赖于计算机
如果a
和b
是整数,则a / b
将始终给您除法的整数商,而a % b
将始终给你整数除法的余数。
在性能方面,您可以看看这个StackOverflow问题,但它似乎取决于体系结构。
您应该使用a / b
和a % b
进行整数除法和余数。正如Levans所说,这些保证会为您提供独立于硬件的"正确"值(至少在a
和b
为正的情况下)。对于浮点运算,结果可能会受到舍入误差的影响,舍入误差也可能与硬件有关。
因此,您可以获得两个浮点值,而不是整数模,然后将一个浮点值与除法器的倒数相乘:
17.0 * 0.33 = 5.61
然后将其floor()转换为整数并减去:
5.61 - 5 ----> 0.61
然后将结果与0.33:的倒数相乘
0.61 * 3 ------> 1.83
然后接收
2 ----> this is 17%3
根据用户"Oseiskar"的基准测试,这比使用直接模量慢14倍。
相关文章:
- C++编译器中有哪些非确定性的例子?
- 如何在 Python C++ 混合库中调试非确定性分段错误?
- 读取文本文件时的浮点确定性
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 如何在C++中实现确定性有限自动机类
- 仅在 boost::hash_combine 中运行一个程序期间保证确定性
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 使用std::map是否应该是确定性的
- C++std::hash实现总是确定性的吗
- 哪些计算机支持非确定性random_device?
- 是弦读读取失败非确定性的
- 通过在迭代指针键映射上出错来捕获非确定性
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- 为什么这些直方图功能有所不同,为什么一个非确定性
- 确定性米勒-拉宾实现
- GCC.obj文件输出不具有确定性(.debug_info,PROGPITS部分)
- 从方法非确定性行为返回 std::字符串
- Boost Filesystem Directory_iterator的非确定性执行
- 海湾合作委员会的"void pointer arithmetic"确定性吗?
- 标准库容器迭代器的递增/递减迭代器是否具有确定性