[FFmpeg-devel] [PATCHv2] configure+libm.h: add hypot emulation
Ganesh Ajjanagadde
gajjanag at mit.edu
Sat Nov 21 14:55:00 CET 2015
On Tue, Nov 17, 2015 at 11:05 AM, Hendrik Leppkes <h.leppkes at gmail.com> wrote:
> On Tue, Nov 17, 2015 at 5:00 PM, Ganesh Ajjanagadde <gajjanag at mit.edu> wrote:
>> On Sun, Nov 15, 2015 at 11:59 AM, Ganesh Ajjanagadde <gajjanag at mit.edu> wrote:
>>> On Sun, Nov 15, 2015 at 11:34 AM, Michael Niedermayer
>>> <michael at niedermayer.cc> wrote:
>>>> On Sun, Nov 15, 2015 at 11:01:58AM -0500, Ganesh Ajjanagadde wrote:
>>>>> On Sun, Nov 15, 2015 at 10:56 AM, Michael Niedermayer
>>>>> <michael at niedermayer.cc> wrote:
>>>>> > On Sun, Nov 15, 2015 at 10:03:37AM -0500, Ganesh Ajjanagadde wrote:
>>>>> >> It is known that the naive sqrt(x*x + y*y) approach for computing the
>>>>> >> hypotenuse suffers from overflow and accuracy issues, see e.g
>>>>> >> http://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/.
>>>>> >> This adds hypot support to FFmpeg, a C99 function.
>>>>> >>
>>>>> >> On platforms without hypot, this patch does a reaonable workaround, that
>>>>> >> although not as accurate as GNU libm, is readable and does not suffer
>>>>> >> from the overflow issue. Improvements can be made separately.
>>>>> >>
>>>>> >> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
>>>>> >> ---
>>>>> >> configure | 2 ++
>>>>> >> libavutil/libm.h | 23 +++++++++++++++++++++++
>>>>> >> 2 files changed, 25 insertions(+)
>>>>> >>
>>>>> >> diff --git a/configure b/configure
>>>>> >> index d518b21..45df724 100755
>>>>> >> --- a/configure
>>>>> >> +++ b/configure
>>>>> >> @@ -1774,6 +1774,7 @@ MATH_FUNCS="
>>>>> >> exp2
>>>>> >> exp2f
>>>>> >> expf
>>>>> >> + hypot
>>>>> >> isinf
>>>>> >> isnan
>>>>> >> ldexpf
>>>>> >> @@ -5309,6 +5310,7 @@ disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersi
>>>>> >>
>>>>> >> atan2f_args=2
>>>>> >> copysign_args=2
>>>>> >> +hypot_args=2
>>>>> >> ldexpf_args=2
>>>>> >> powf_args=2
>>>>> >>
>>>>> >> diff --git a/libavutil/libm.h b/libavutil/libm.h
>>>>> >> index 6c17b28..f7a2b41 100644
>>>>> >> --- a/libavutil/libm.h
>>>>> >> +++ b/libavutil/libm.h
>>>>> >> @@ -102,6 +102,29 @@ static av_always_inline av_const int isnan(float x)
>>>>> >> }
>>>>> >> #endif /* HAVE_ISNAN */
>>>>> >>
>>>>> >> +#if !HAVE_HYPOT
>>>>> >> +#undef hypot
>>>>> >> +static inline av_const double hypot(double x, double y)
>>>>> >> +{
>>>>> >> + double ret, temp;
>>>>> >> + x = fabs(x);
>>>>> >> + y = fabs(y);
>>>>> >> +
>>>>> >> + if (isinf(x) || isinf(y))
>>>>> >> + return av_int2double(0x7ff0000000000000);
>>>>> >
>>>>> > if either is NaN the result should be NaN i think
>>>>> > return x+y
>>>>> > might achive this
>>>>>
>>>>> No, quoting the man page/standard:
>>>>> If x or y is an infinity, positive infinity is returned.
>>>>>
>>>>> If x or y is a NaN, and the other argument is not an infinity,
>>>>> a NaN is returned.
>>>>
>>>> indeed, the spec says thats how it should be.
>>>>
>>>> this is not what i expected though and renders the function
>>>> problematic in practice IMHO.
>>>> For example a big use of NaN is to detect errors.
>>>> One does a big complicated computation and if at the end the result is
>>>> NaN or +-Inf then one knows there was something wrong in it.
>>>> if NaN is infective then any computation that returns it can reliably
>>>> be detected. These exceptions in C like hypot() break this.
>>>> 1/hypot(x,y) should be NaN if either x or y was NaN
>>>>
>>>> also mathematically its wrong to ignore a NaN argument
>>>> consider
>>>> hypot(sqrt(-x), sqrt(x)) for x->infinite
>>>>
>>>> of course theres nothing we can or should do about hypot() its defined
>>>> in C as it is defined but its something one should be aware of if
>>>> one expects that NaNs can be used as a reliable means to detect
>>>> NaNs from intermediate steps of a complicated calculation
>>>
>>> Yes, I was extremely surprised myself, and you are right that it
>>> defeats the NaN's purpose. Some day I may dig up the committee's
>>> rationale for this, am curious. I doubt it was oversight, since they
>>> are usually very careful about such things, and the defined behavior
>>> is very specific suggesting deep thought.
>>>
>>> Anyway, I do not take this as a formal ack yet. Hopefully we don't run
>>> into Carl's weird debian thing that forced disabling fmax, fmin
>>> emulation.
>>
>> Anyone willing to do a Windows build test to make sure that the compat
>> hack works? I want to avoid build failures. Thanks.
>>
>
> hypot is available on windows, can't test your compat code, sorry. :D
pushed, took Michael's analysis as an ack, thanks.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list