负小数Objective-C的模函数是什么?

负小数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

我需要用小数计算模,也可以是负数 例如: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+=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;
}