为什么我们需要 IEEE 754 余数?

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

我刚刚阅读了这个主题(尤其是最后的评论)。

然后我想知道,为什么我们真正需要这个是为了给剩下的。但似乎之前“谷歌上”没有多少人对此感兴趣......

floating-point modulo ieee-754
2个回答
8
投票

如果您正在寻找想要它的原因,其中之一就是所谓的“范围缩小”

假设您需要

sind
函数来计算以度为单位的参数的正弦值。一个天真的方法是

sind(x) = sin(x*pi/180) 

不过这里的

pi
并不是真正的无理数
pi
,而是最接近
pi
的浮点数。这会导致诸如
sind(180) == 1.2246467991473532e-16
之类的问题,以及像 thisthis 这样的问题(还有很多很多)。

但是正弦是一个周期函数,所以如果我们计算

remainder(x,90.0)

我们得到一个区间[-45,45]上的值。请注意,0、90、180、270 等恰好变为 0,并且乘以

pi/180
仍然是 0。因此,采用适当的带符号
sin
cos
,我们可以得到这些值的精确结果(并且如果您进行一些基本的误差分析,您可以证明它也减少了其他值的误差)。

两个跟进点:

  1. 如何确定使用哪个
    sin
    cos
    ?嗯,这就是
    remquo
    的用途。
  2. 不幸的是,由于中间舍入的变化莫测,这仍然不能准确地给出
    sind(30.0) == 0.5
    。有一些方法可以解决这个问题,例如看看 Julia 图书馆做了什么

0
投票

可用于获取最接近的倍数:

double NearestMultiple(double value, double divider)
{
    return value - double.Ieee754Remainder(value, divider);
}

> NearestMultiple(11, 3)
12
> NearestMultiple(10, 3)
9

不确定有没有用🤔

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