Why do we need IEEE 754 remainder?

非 Y 不嫁゛ 提交于 2019-12-01 18:05:00
Simon Byrne

If you're looking for reasons why you would want it, one is for what is known as "range reduction"

Let's say you want sind function for computing the sine of an argument in degrees. A naive way to do this would be

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

However pi here is not the true irrational number pi, but instead the floating point number closest to pi. This leads to things like sind(180) == 1.2246467991473532e-16, and SO questions like this and this (and many, many more).

But sine is a periodic function, so if we compute

remainder(x,90.0)

we get a value on the interval [-45,45]. Note that 0, 90, 180, 270, etc. become exactly 0, and multiplying by pi/180 is still 0. Therefore taking the appropriately signed sin or cos, we can get the exact result at these values (and if you do some basic error analysis, you can demonstrate that it also reduces the error at other values).

Two follow up points:

  1. How do you determine which sin or cos to use? Well, that's what remquo is for.
  2. Unfortunately, this still won't give sind(30.0) == 0.5 exactly, due to the vagaries of intermediate rounding. There are ways to fix this, e.g. see what the Julia library does.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!