我刚刚阅读了这个主题(尤其是最后的评论)。
然后我想知道,为什么我们真正需要这个是为了给剩下的。但似乎之前“谷歌上”没有多少人对此感兴趣......
如果您正在寻找想要它的原因,其中之一就是所谓的“范围缩小”
假设您需要
sind
函数来计算以度为单位的参数的正弦值。一个天真的方法是
sind(x) = sin(x*pi/180)
不过这里的
pi
并不是真正的无理数pi
,而是最接近pi
的浮点数。这会导致诸如 sind(180) == 1.2246467991473532e-16
之类的问题,以及像 this 和 this 这样的问题(还有很多很多)。
但是正弦是一个周期函数,所以如果我们计算
remainder(x,90.0)
我们得到一个区间[-45,45]上的值。请注意,0、90、180、270 等恰好变为 0,并且乘以
pi/180
仍然是 0。因此,采用适当的带符号 sin
或 cos
,我们可以得到这些值的精确结果(并且如果您进行一些基本的误差分析,您可以证明它也减少了其他值的误差)。
两个跟进点:
sin
或 cos
?嗯,这就是 remquo
的用途。sind(30.0) == 0.5
。有一些方法可以解决这个问题,例如看看 Julia 图书馆做了什么。可用于获取最接近的倍数:
double NearestMultiple(double value, double divider)
{
return value - double.Ieee754Remainder(value, divider);
}
> NearestMultiple(11, 3)
12
> NearestMultiple(10, 3)
9
不确定有没有用🤔