浮点模数运算

我正在尝试实施三角函数的范围缩减操作。 但相反,我认为对输入数据执行模数pi / 2操作可能会更好。 我想知道什么算法存在并且对于32位IEEE 754浮点的操作有效?

我必须在汇编中实现这个,所以fmod,除法,乘法等只有一条指令不可用。 我的处理器使用16位字,我实现了32位浮点加法,减法,乘法,除法,平方根,余弦和正弦。 我只需要范围缩减(模数)来输入余弦和正弦值。

我认为标准库的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 

因此它实际上使用专用CPU指令(fprem)进行计算。

也许我在这里忽略了这一点,但你有什么反对简单地使用fmod吗?

 double theta = 10.4; const double HALF_PI = 2 * atan(1); double result = fmod(theta, HALF_PI); 

您想要的算法,将浮点value限制在0和某些模数n

 Double fmod(Double value, Double modulus) { return value - Trunc(value/modulus)*modulus; } 

例如pi mod e (3.14159265358979 mod 2.718281828459045)

 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