负小数Objective-C的模函数是什么?
我需要用小数计算模,也可以是负数 例如:fmod(-5.2,3); 虽然mod()可以处理整数,而fmod()(或fmodf())可以处理小数,但fmod()会返回错误的负小数结果: 例: 库中是否有另一个mod(),或者我是否应该编写自己的十进制负mod函数? 比如:负小数Objective-C的模函数是什么?,objective-c,modulo,Objective C,Modulo,我需要用小数计算模,也可以是负数 例如:fmod(-5.2,3); 虽然mod()可以处理整数,而fmod()(或fmodf())可以处理小数,但fmod()会返回错误的负小数结果: 例: 库中是否有另一个mod(),或者我是否应该编写自己的十进制负mod函数? 比如: if (res = fmod(x,m) < 0) { res+=m; } if(res=fmod(x,m)0){ res=negMod; }否则{ res=-posMod; } } 返回res; } 如果结果小于0
if (res = fmod(x,m) < 0) {
res+=m;
}
if(res=fmod(x,m)<0){
res+=m;
}
谢谢 -2.2是正确的,也是-5.2 mod 3。
fmod
函数是一个C函数(因此也是目标C),因此您可以通过在终端中键入man fmod
来查找有关它的更多详细信息。执行fmod
时,它将保留您正在修改的值的符号。因此,要获得所需的模,需要检查符号(结果或传入的值),如果为负数,则需要添加模基,在本例中为3
这是fmod功能的定义:
double
fmod(双x,双y)代码>
具体来说,函数返回某个整数i的值x-i*y,因此,如果y为非零,则结果与x具有相同的符号,且幅值小于y的幅值。
从OS X手册页。出于您的目的,您可以执行以下操作:
#include <math.h>
float f_mod(float a, float n) {
return a - n * floor(a / n);
}
谢谢你,所以我最后写了一封信。。。我跳的东西我可以避免。这对我来说非常有用,在我看来,它代表了模的正确数学定义(而不是C实现)。我确信此功能可以优化,但为了清晰起见,我将其保留为:
//--
//-- Modulo
//--
double calcModulo ( double x, double m) {
double res = INFINITY;
if (m==0)
return res ;
double posMod, negMod, posM, posX;
posM = m < 0 ? -m:m;
posX = x < 0 ? -x:x;
posMod = fmod (posX, posM);
negMod = fmod (-posX,posM) + posM;
// pick up the correct res
if ( x >= 0 ){
if (m > 0) {
res = posMod;
} else {
res = -negMod;
}
}else{
if (m > 0) {
res= negMod;
} else{
res= -posMod;
}
}
return res;
}
//--
//--模
//--
双倍calcModulo(双倍x,双倍m){
双精度=无穷大;
如果(m==0)
返回res;
双posMod、negMod、posM、posX;
posM=m<0?-m:m;
posX=x<0?-x:x;
posMod=fmod(posX,posM);
negMod=fmod(-posX,posM)+posM;
//选择正确的res
如果(x>=0){
如果(m>0){
res=posMod;
}否则{
res=-negMod;
}
}否则{
如果(m>0){
res=negMod;
}否则{
res=-posMod;
}
}
返回res;
}
如果结果小于0,您可以只添加3?只需写一个包装。
f_mod(-5.2f, 2.0f) = 0.8
f_mod(5.2f, 2.0f) = 2.2
//--
//-- Modulo
//--
double calcModulo ( double x, double m) {
double res = INFINITY;
if (m==0)
return res ;
double posMod, negMod, posM, posX;
posM = m < 0 ? -m:m;
posX = x < 0 ? -x:x;
posMod = fmod (posX, posM);
negMod = fmod (-posX,posM) + posM;
// pick up the correct res
if ( x >= 0 ){
if (m > 0) {
res = posMod;
} else {
res = -negMod;
}
}else{
if (m > 0) {
res= negMod;
} else{
res= -posMod;
}
}
return res;
}