Mic*_*ski 18
我认为标准库fmod()在大多数情况下都是最佳选择.这是几个简单算法讨论的链接.
在我的机器上,fmod()使用优化的内联汇编代码(/usr/include/bits/mathinline.h):
#if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
__inline_mathcodeNP2 (fmod, __x, __y, \
register long double __value; \
__asm __volatile__ \
("1: fprem\n\t" \
"fnstsw %%ax\n\t" \
"sahf\n\t" \
"jp 1b" \
: "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); \
return __value)
#endif
Run Code Online (Sandbox Code Playgroud)
因此它实际上使用专用CPU指令(fprem)进行计算.
Pra*_*mar 15
也许我在这里忽略了这一点,但你有什么反对简单地使用fmod吗?
double theta = 10.4;
const double HALF_PI = 2 * atan(1);
double result = fmod(theta, HALF_PI);
Run Code Online (Sandbox Code Playgroud)
你想要的算法,来限制浮点value之间0有些模量n:
Double fmod(Double value, Double modulus)
{
return value - Trunc(value/modulus)*modulus;
}
Run Code Online (Sandbox Code Playgroud)
例如pi mod e(3.14159265358979 mod 2.718281828459045)
Run Code Online (Sandbox Code Playgroud)3.14159265358979 / 2.718281828459045 = 1.1557273497909217179 Trunc(1.1557273497909217179) = 1 1.1557273497909217179 - 1 = 0.1557273497909217179 0.1557273497909217179 * e = 0.1557273497909217179 * 2.718281828459045 = 0.42331082513074800
pi mod e = 0.42331082513074800