Peter Eisentraut <peter_e@gmx.net> writes:
> On 04/19/2016 04:48 PM, Tom Lane wrote:
>> Pushed. Peter, what results do you get from these tests on your
>> problematic machine?
> acosd(x),
> acosd(x) IN (0,60,90,120,180) AS acosd_exact
> FROM (VALUES (-1), (-0.5), (0), (0.5), (1)) AS t(x);
> - x | asind | asind_exact | acosd | acosd_exact
> -------+-------+-------------+-------+-------------
> - -1 | -90 | t | 180 | t
> - -0.5 | -30 | t | 120 | t
> - 0 | 0 | t | 90 | t
> - 0.5 | 30 | t | 60 | t
> - 1 | 90 | t | 0 | t
> + x | asind | asind_exact | acosd | acosd_exact
> +------+----------------------+-------------+-------+-------------
> + -1 | -90 | t | 180 | t
> + -0.5 | -29.9999999999999964 | f | 120 | t
> + 0 | 0 | t | 90 | t
> + 0.5 | 29.9999999999999964 | f | 60 | t
> + 1 | 90 | t | 0 | t
> (5 rows)
> This is the same under the default -O2 and under -O0.
Hm. This seems to prove that we're not getting exactly 1.0 from
(asin(x) / asin_0_5) with x = 0.5, but I'm having a hard time guessing
why that might be so when all the other cases work.
Could you send along the assembler code generated by the compiler (-S
output) for float.c? Maybe that would shed some light. Probably the
-O0 version would be easier to read.
regards, tom lane