如何实现具有良好精度的 fmod 函数而不将它们转换为 double/long double?

问题描述 投票:0回答:1

我正在尝试在汇编中实现 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)

algorithm floating-point precision calculation
1个回答
0
投票

就像小学数学一样。

对符号、无穷大、NAN 进行调整。
向左移动 (

y *=* 2
) 直到
shifted_y
超过
x

右移 (

shifted_y /= 2
) 并尽可能减去
x -= shifted_y
。重复同时
x >= shifted_y

返回

x

在基本方法之后,寻找优化。

© www.soinside.com 2019 - 2024. All rights reserved.