c++中的模函数,其行为类似于matlab中的mod
Modulo function in c++, that behaves like mod in matlab
我对周期域(框)中的许多粒子(最多100000个)进行了模拟,为了让粒子留在框内,我使用了带有浮点或双数的模函数。
在Matlab
中,使用mod
功能一切都很好。然而,在C++
中,我发现函数fmod
并不完全等于Matlab的mod
函数:
mod(-0.5,10)=9.5
-我想在C++
中得到这个结果
fmod(-0.5,10)=-0.5
-我不想要这个。
I、 当然,可以用if语句解决我的问题。然而,我认为,这将影响效率(如果语句在关键循环中)。有没有一种方法可以在没有if
语句的情况下实现这个函数?可能是其他功能?
谢谢。
只需使用一个条件。它不会对效率产生有意义的影响。
inline double realmod (x, y)
{
result = fmod(x, y);
return result >= 0 ? result : result + y;
}
CCD_ 10调用汇编指令CCD_,http://www.intel.com/design/pentium/manuals/24143004.pdf)。条件和浮点加法的跳转指令只有5个左右
当你的代码有浮点除法时,你不需要为小事而烦恼。
使用floor
和正则除法:
float modulo(float a, float q)
{
float b = a / q;
return (b - floor(b)) * q;
}
或者可以将除数添加到fmod
的结果中,而不需要分支:
float modulo(float a, float q)
{
float m = fmod(a, q);
return m + q * (m < 0.f);
}
基于Matlabmod(a, m)
文档和@QuestionC的答案-
一个与Matlab行为完全相同的通用解决方案-也适用于负和零除数。
针对多个值进行测试:
static inline double MatlabMod(double q, double m)
{
if(m == 0)
return q;
double result = fmod(q, m);
return ((result >= 0 && m > 0) || (q <= 0 && m < 0)) ? result : (result + m);
}
用matlab测试:
(q, m) -> result
(54321)->54
(-50512)->462
(54,-152)->-98
(-53,-500)->-53
(-500300)->100
(-5000040)->200
(-1000,-360)->-280
(500360)->140
(1000360)->280
(-1000360)->80
(-5051,0)->-5051
(512,0)->512
(0,52)->0
(0,-58)->0
在应用模运算符之前,只需将除数添加到要在区间中保留的数字即可:
return fmod(a+q,q);
这根本不需要分支。
如果你必须担心a
在两次更新之间超过-q
,你可以通过以下方式使其更加健壮:
return fmod(a+q*10,q);
适用于CCD_ 18
最简单的方法是在没有任何分支的情况下同时处理浮点和int。
// b = MOD(a, m)
int a = a - m * floor(a / m) + m;
int b = a - m * floor(a / m);
- 类似于strcat()的函数出现问题
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 创建类似于布尔值的变量类型
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 如何创建类似于 QVariant 的变体类
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- C++中用于结构的纯数组的类似于TableView/DataFrame的通用功能
- 有没有类似于stoi的函数可以用于模板类
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 序列化模式类似于boost::序列化
- 构造一个类似于JSON文件c++的字符串
- 如何在C++中制作类似于 MATLAB 的绘图库?
- c++中的模函数,其行为类似于matlab中的mod
- OpenCV函数来计算类似于MATLAB产品的数组元素的乘积?
- OpenCV中的熵滤波器类似于matlab中的entropyfilter()函数