我正在尝试在汇编中实现 fmodf 函数。我使用的公式如下。
fmodf(浮点 x,浮点 y) = x - trunc(x / y) * y
问题是,当 x>>y 时,函数的精度越来越差。事实上,当abs(x/y)>2^23时,trunc不会去掉小数部分,因为它没有小数部分。(我知道IEEE-754浮点标准的尾数是23位)
我研究了cmath中fmod的实现,它只使用了__built_in_remainderl,它基本上使用long double而不是float,我不能在我的程序集中使用它(它不支持double或long double)
就像小学数学一样。
对符号、无穷大、NAN 进行调整。
向左移动 (
y *=* 2
) 直到 shifted_y
超过 x
。
右移 (
shifted_y /= 2
) 并尽可能减去 x -= shifted_y
。重复同时x >= shifted_y
。
返回
x
。
在基本方法之后,寻找优化。