与matlab mod()相比,c中的fmod()如何工作?
How does fmod() in c work compared with matlab mod()?
在 matlab 代码中
Longitude = mod(-1789.8916,360);
returns 值 10.108325
但在 C 代码中
Longitude = fmod(-1789.8916,360);
returns值-349.8916
我想要与 C 代码中相同的值
matlab mod
函数总是 return 一个正值,但是 C fmod
函数(至少从 C11 开始)将 return 一个负值,如果第一个论据是否定的。 (在以前的 C 标准中,否定参数的精确行为取决于实现)。
因此,如果第一个参数为负且结果大于零,您可以通过从答案中减去 360(在本例中)来转换 matlab 版本。
mod
函数始终 returns 在 MATLAB 中为正值,从 C11 fmod
returns 如果第一个参数为负,则为负值。
您可以使用此函数在 MATLAB
中模仿 fmod
的行为
function m = fmod(a, b)
% Where the mod function returns a value in region [0, b), this
% function returns a value in the region [-b, b), with a negative
% value only when a is negative.
if a == 0
m = 0;
else
m = mod(a, b) + (b*(sign(a) - 1)/2);
end
end
解释:
sign(a)
当a
为正数时为1
,或当a
为负数时-1
。
(sign(a) - 1)/2
因此分别是 0
或 -1
。
如果 a
为负数,这会导致从结果中减去 b
,得到所需的结果范围 [-b, b)
.
在 matlab 代码中
Longitude = mod(-1789.8916,360);
returns 值 10.108325
但在 C 代码中
Longitude = fmod(-1789.8916,360);
returns值-349.8916
我想要与 C 代码中相同的值
matlab mod
函数总是 return 一个正值,但是 C fmod
函数(至少从 C11 开始)将 return 一个负值,如果第一个论据是否定的。 (在以前的 C 标准中,否定参数的精确行为取决于实现)。
因此,如果第一个参数为负且结果大于零,您可以通过从答案中减去 360(在本例中)来转换 matlab 版本。
mod
函数始终 returns 在 MATLAB 中为正值,从 C11 fmod
returns 如果第一个参数为负,则为负值。
您可以使用此函数在 MATLAB
中模仿fmod
的行为
function m = fmod(a, b)
% Where the mod function returns a value in region [0, b), this
% function returns a value in the region [-b, b), with a negative
% value only when a is negative.
if a == 0
m = 0;
else
m = mod(a, b) + (b*(sign(a) - 1)/2);
end
end
解释:
sign(a)
当a
为正数时为1
,或当a
为负数时-1
。
(sign(a) - 1)/2
因此分别是 0
或 -1
。
如果 a
为负数,这会导致从结果中减去 b
,得到所需的结果范围 [-b, b)
.