16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef HAVE_CONFIG_H
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <cvconfig.h>
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_MATH_BLOCK_SIZE  256
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_SQRT_MAGIC     0xbe6f0000
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_SQRT_MAGIC_DBL CV_BIG_UINT(0xbfcd460000000000)
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_ATAN_CF0  (-15.8131890796f)
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_ATAN_CF1  (61.0941945596f)
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_ATAN_CF2  0.f /*(-0.140500406322f)*/
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const float icvAtanTab[8] = { 0.f + _CV_ATAN_CF2, 90.f - _CV_ATAN_CF2,
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    180.f - _CV_ATAN_CF2, 90.f + _CV_ATAN_CF2,
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    360.f - _CV_ATAN_CF2, 270.f + _CV_ATAN_CF2,
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    180.f + _CV_ATAN_CF2, 270.f - _CV_ATAN_CF2
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const int icvAtanSign[8] =
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    { 0, 0x80000000, 0x80000000, 0, 0x80000000, 0, 0, 0x80000000 };
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL float
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvFastArctan( float y, float x )
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv32suf _x, _y;
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ix, iy, ygx, idx;
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double z;
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _x.f = x; _y.f = y;
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ix = _x.i; iy = _y.i;
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    idx = (ix < 0) * 2 + (iy < 0) * 4;
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ix &= 0x7fffffff;
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iy &= 0x7fffffff;
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ygx = (iy <= ix) - 1;
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    idx -= ygx;
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    idx &= ((ix == 0) - 1) | ((iy == 0) - 1);
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* swap ix and iy if ix < iy */
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ix ^= iy & ygx;
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iy ^= ix & ygx;
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ix ^= iy & ygx;
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _y.i = iy ^ icvAtanSign[idx];
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* ix = ix != 0 ? ix : 1.f */
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _x.i = ((ix ^ CV_1F) & ((ix == 0) - 1)) ^ CV_1F;
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    z = _y.f / _x.f;
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (float)((_CV_ATAN_CF0*fabs(z) + _CV_ATAN_CF1)*z + icvAtanTab[idx]);
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvFastArctan_32f,
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (const float *__y, const float *__x, float *angle, int len ), (__y, __x, angle, len) )
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int *y = (const int*)__y, *x = (const int*)__x;
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !(y && x && angle && len >= 0) )
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* unrolled by 4 loop */
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i <= len - 4; i += 4 )
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int j, idx[4];
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float xf[4], yf[4];
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double d = 1.;
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        /* calc numerators and denominators */
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < 4; j++ )
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int ix = x[i + j], iy = y[i + j];
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int ygx, k = (ix < 0) * 2 + (iy < 0) * 4;
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Cv32suf _x, _y;
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ix &= 0x7fffffff;
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iy &= 0x7fffffff;
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ygx = (iy <= ix) - 1;
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k -= ygx;
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k &= ((ix == 0) - 1) | ((iy == 0) - 1);
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            /* swap ix and iy if ix < iy */
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ix ^= iy & ygx;
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iy ^= ix & ygx;
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ix ^= iy & ygx;
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _y.i = iy ^ icvAtanSign[k];
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            /* ix = ix != 0 ? ix : 1.f */
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _x.i = ((ix ^ CV_1F) & ((ix == 0) - 1)) ^ CV_1F;
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            idx[j] = k;
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            yf[j] = _y.f;
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d *= (xf[j] = _x.f);
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d = 1. / d;
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double b = xf[2] * xf[3], a = xf[0] * xf[1];
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float z0 = (float) (yf[0] * xf[1] * b * d);
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float z1 = (float) (yf[1] * xf[0] * b * d);
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float z2 = (float) (yf[2] * xf[3] * a * d);
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float z3 = (float) (yf[3] * xf[2] * a * d);
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z0 = (float)((_CV_ATAN_CF0*fabs(z0) + _CV_ATAN_CF1)*z0 + icvAtanTab[idx[0]]);
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z1 = (float)((_CV_ATAN_CF0*fabs(z1) + _CV_ATAN_CF1)*z1 + icvAtanTab[idx[1]]);
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z2 = (float)((_CV_ATAN_CF0*fabs(z2) + _CV_ATAN_CF1)*z2 + icvAtanTab[idx[2]]);
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z3 = (float)((_CV_ATAN_CF0*fabs(z3) + _CV_ATAN_CF1)*z3 + icvAtanTab[idx[3]]);
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            angle[i] = z0;
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            angle[i+1] = z1;
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            angle[i+2] = z2;
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            angle[i+3] = z3;
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* process the rest */
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < len; i++ )
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        angle[i] = cvFastArctan( __y[i], __x[i] );
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* ************************************************************************** *\
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   Fast cube root by Ken Turkowski
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   (http://www.worldserver.com/turk/computergraphics/papers.html)
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\* ************************************************************************** */
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  float  cvCbrt( float value )
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float fr;
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv32suf v, m;
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ix, s;
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ex, shx;
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    v.f = value;
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ix = v.i & 0x7fffffff;
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    s = v.i & 0x80000000;
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ex = (ix >> 23) - 127;
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    shx = ex % 3;
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    shx -= shx >= 0 ? 3 : 0;
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ex = (ex - shx) / 3; /* exponent of cube root */
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    v.i = (ix & ((1<<23)-1)) | ((shx + 127)<<23);
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    fr = v.f;
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* 0.125 <= fr < 1.0 */
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Use quartic rational polynomial with error < 2^(-24) */
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    fr = (float)(((((45.2548339756803022511987494 * fr +
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    192.2798368355061050458134625) * fr +
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    119.1654824285581628956914143) * fr +
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    13.43250139086239872172837314) * fr +
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.1636161226585754240958355063)/
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((((14.80884093219134573786480845 * fr +
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    151.9714051044435648658557668) * fr +
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    168.5254414101568283957668343) * fr +
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    33.9905941350215598754191872) * fr +
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0));
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* fr *= 2^ex * sign */
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.f = value;
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    v.f = fr;
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    v.i = (v.i + (ex << 23) + s) & (m.i*2 != 0 ? -1 : 0);
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return v.f;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//static const double _0_5 = 0.5, _1_5 = 1.5;
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvInvSqrt_32f, (const float *src, float *dst, int len), (src, dst, len) )
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !(src && dst && len >= 0) )
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < len; i++ )
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i] = (float)(1.f/sqrt(src[i]));
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvSqrt_32f, (const float *src, float *dst, int len), (src, dst, len) )
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !(src && dst && len >= 0) )
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < len; i++ )
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i] = (float)sqrt(src[i]);
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvSqrt_64f, (const double *src, double *dst, int len), (src, dst, len) )
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !(src && dst && len >= 0) )
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < len; i++ )
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i] = sqrt(src[i]);
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvInvSqrt_64f, (const double *src, double *dst, int len), (src, dst, len) )
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !(src && dst && len >= 0) )
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFACTOR_ERR;
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < len; i++ )
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i] = 1./sqrt(src[i]);
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_SQR_MAGNITUDE_FUNC(flavor, arrtype, magtype)\
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                  \
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSqrMagnitude_##flavor(const arrtype* x, const arrtype* y,\
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         magtype* mag, int len)             \
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                           \
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                  \
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i <= len - 4; i += 4 )                      \
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                       \
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        magtype x0 = (magtype)x[i], y0 = (magtype)y[i];     \
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        magtype x1 = (magtype)x[i+1], y1 = (magtype)y[i+1]; \
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = x0*x0 + y0*y0;                                 \
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = x1*x1 + y1*y1;                                 \
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mag[i] = x0;                                        \
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mag[i+1] = x1;                                      \
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = (magtype)x[i+2], y0 = (magtype)y[i+2];         \
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = (magtype)x[i+3], y1 = (magtype)y[i+3];         \
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = x0*x0 + y0*y0;                                 \
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = x1*x1 + y1*y1;                                 \
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mag[i+2] = x0;                                      \
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mag[i+3] = x1;                                      \
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                       \
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < len; i++ )                                   \
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                       \
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        magtype x0 = (magtype)x[i], y0 = (magtype)y[i];     \
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mag[i] = x0*x0 + y0*y0;                             \
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                       \
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                            \
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                           \
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SQR_MAGNITUDE_FUNC( 32f, float, float )
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_SQR_MAGNITUDE_FUNC( 64f, double, double )
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                  Cartezian -> Polar                                    *
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCartToPolar( const CvArr* xarr, const CvArr* yarr,
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               CvArr* magarr, CvArr* anglearr,
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               int angle_in_degrees )
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCartToPolar" );
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* mag_buffer = 0;
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* x_buffer = 0;
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* y_buffer = 0;
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = 0;
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat xstub, *xmat = (CvMat*)xarr;
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat ystub, *ymat = (CvMat*)yarr;
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat magstub, *mag = (CvMat*)magarr;
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat anglestub, *angle = (CvMat*)anglearr;
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0, coi3 = 0, coi4 = 0;
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth;
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cont_flag = CV_MAT_CONT_FLAG;
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(xmat))
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( xmat = cvGetMat( xmat, &xstub, &coi1 ));
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(ymat))
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( ymat = cvGetMat( ymat, &ystub, &coi2 ));
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( xmat, ymat ) )
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( xmat, ymat ) )
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH( xmat->type );
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth < CV_32F )
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( mag )
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mag = cvGetMat( mag, &magstub, &coi3 ));
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_TYPES_EQ( mag, xmat ) )
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( mag, xmat ) )
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag = mag->type;
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( angle )
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( angle = cvGetMat( angle, &anglestub, &coi4 ));
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_TYPES_EQ( angle, xmat ) )
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( angle, xmat ) )
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag &= angle->type;
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 || coi3 != 0 || coi4 != 0 )
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize(xmat);
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN(xmat->type);
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( xmat->type & ymat->type & cont_flag ))
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    block_size = MIN( size.width, ICV_MATH_BLOCK_SIZE );
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth == CV_64F && angle )
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x_buffer = (float*)cvStackAlloc( block_size*sizeof(float));
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y_buffer = (float*)cvStackAlloc( block_size*sizeof(float));
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( depth == CV_32F && mag )
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mag_buffer = (float*)cvStackAlloc( block_size*sizeof(float));
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth == CV_32F )
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* x_data = (float*)(xmat->data.ptr + xmat->step*y);
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* y_data = (float*)(ymat->data.ptr + ymat->step*y);
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* mag_data = mag ? (float*)(mag->data.ptr + mag->step*y) : 0;
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* angle_data = angle ? (float*)(angle->data.ptr + angle->step*y) : 0;
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x += block_size )
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = MIN( size.width - x, block_size );
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( mag )
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvSqrMagnitude_32f( x_data + x, y_data + x, mag_buffer, len );
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( angle )
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvFastArctan_32f( y_data + x, x_data + x, angle_data + x, len );
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !angle_in_degrees )
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        icvScale_32f( angle_data + x, angle_data + x,
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      len, (float)(CV_PI/180.), 0 );
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( mag )
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvSqrt_32f( mag_buffer, mag_data + x, len );
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* x_data = (double*)(xmat->data.ptr + xmat->step*y);
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* y_data = (double*)(ymat->data.ptr + ymat->step*y);
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* mag_data = mag ? (double*)(mag->data.ptr + mag->step*y) : 0;
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* angle_data = angle ? (double*)(angle->data.ptr + angle->step*y) : 0;
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x += block_size )
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = MIN( size.width - x, block_size );
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( angle )
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvCvt_64f32f( x_data + x, x_buffer, len );
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvCvt_64f32f( y_data + x, y_buffer, len );
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( mag )
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvSqrMagnitude_64f( x_data + x, y_data + x, mag_data + x, len );
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvSqrt_64f( mag_data + x, mag_data + x, len );
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( angle )
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvFastArctan_32f( y_buffer, x_buffer, x_buffer, len );
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !angle_in_degrees )
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        icvScale_32f( x_buffer, x_buffer, len, (float)(CV_PI/180.), 0 );
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvCvt_32f64f( x_buffer, angle_data + x, len );
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                  Polar -> Cartezian                                    *
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSinCos_32f( const float *angle,float *sinval, float* cosval,
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len, int angle_in_degrees )
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int N = 64;
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double sin_table[] =
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.00000000000000000000,     0.09801714032956060400,
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.19509032201612825000,     0.29028467725446233000,
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.38268343236508978000,     0.47139673682599764000,
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.55557023301960218000,     0.63439328416364549000,
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.70710678118654746000,     0.77301045336273699000,
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.83146961230254524000,     0.88192126434835494000,
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.92387953251128674000,     0.95694033573220894000,
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.98078528040323043000,     0.99518472667219682000,
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     1.00000000000000000000,     0.99518472667219693000,
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.98078528040323043000,     0.95694033573220894000,
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.92387953251128674000,     0.88192126434835505000,
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.83146961230254546000,     0.77301045336273710000,
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.70710678118654757000,     0.63439328416364549000,
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.55557023301960218000,     0.47139673682599786000,
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.38268343236508989000,     0.29028467725446239000,
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.19509032201612861000,     0.09801714032956082600,
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     0.00000000000000012246,    -0.09801714032956059000,
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.19509032201612836000,    -0.29028467725446211000,
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.38268343236508967000,    -0.47139673682599764000,
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.55557023301960196000,    -0.63439328416364527000,
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.70710678118654746000,    -0.77301045336273666000,
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.83146961230254524000,    -0.88192126434835494000,
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.92387953251128652000,    -0.95694033573220882000,
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.98078528040323032000,    -0.99518472667219693000,
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -1.00000000000000000000,    -0.99518472667219693000,
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.98078528040323043000,    -0.95694033573220894000,
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.92387953251128663000,    -0.88192126434835505000,
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.83146961230254546000,    -0.77301045336273688000,
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.70710678118654768000,    -0.63439328416364593000,
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.55557023301960218000,    -0.47139673682599792000,
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.38268343236509039000,    -0.29028467725446250000,
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    -0.19509032201612872000,    -0.09801714032956050600,
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double k2 = (2*CV_PI)/N;
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double sin_a0 = -0.166630293345647*k2*k2*k2;
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double sin_a2 = k2;
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double cos_a0 = -0.499818138450326*k2*k2;
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*static const double cos_a2 =  1;*/
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double k1;
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !angle_in_degrees )
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        k1 = N/(2*CV_PI);
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        k1 = N/360.;
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < len; i++ )
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double t = angle[i]*k1;
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int it = cvRound(t);
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t -= it;
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int sin_idx = it & (N - 1);
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int cos_idx = (N/4 - sin_idx) & (N - 1);
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double sin_b = (sin_a0*t*t + sin_a2)*t;
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double cos_b = cos_a0*t*t + 1;
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double sin_a = sin_table[sin_idx];
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double cos_a = sin_table[cos_idx];
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double sin_val = sin_a*cos_b + cos_a*sin_b;
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double cos_val = cos_a*cos_b - sin_a*sin_b;
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sinval[i] = (float)sin_val;
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cosval[i] = (float)cos_val;
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPolarToCart( const CvArr* magarr, const CvArr* anglearr,
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               CvArr* xarr, CvArr* yarr, int angle_in_degrees )
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvPolarToCart" );
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* x_buffer = 0;
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* y_buffer = 0;
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = 0;
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat xstub, *xmat = (CvMat*)xarr;
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat ystub, *ymat = (CvMat*)yarr;
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat magstub, *mag = (CvMat*)magarr;
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat anglestub, *angle = (CvMat*)anglearr;
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0, coi3 = 0, coi4 = 0;
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth;
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cont_flag;
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(angle))
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( angle = cvGetMat( angle, &anglestub, &coi4 ));
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH( angle->type );
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth < CV_32F )
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cont_flag = angle->type;
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( mag )
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(mag))
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mag = cvGetMat( mag, &magstub, &coi3 ));
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_TYPES_EQ( angle, mag ) )
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( angle, mag ) )
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag &= mag->type;
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( xmat )
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(xmat))
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( xmat = cvGetMat( xmat, &xstub, &coi1 ));
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_TYPES_EQ( angle, xmat ) )
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( angle, xmat ) )
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag &= xmat->type;
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ymat )
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT(ymat))
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( ymat = cvGetMat( ymat, &ystub, &coi2 ));
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_TYPES_EQ( angle, ymat ) )
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( angle, ymat ) )
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cont_flag &= ymat->type;
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 || coi3 != 0 || coi4 != 0 )
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize(angle);
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN(angle->type);
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( cont_flag ))
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    block_size = MIN( size.width, ICV_MATH_BLOCK_SIZE );
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    x_buffer = (float*)cvStackAlloc( block_size*sizeof(float));
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    y_buffer = (float*)cvStackAlloc( block_size*sizeof(float));
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth == CV_32F )
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* x_data = (float*)(xmat ? xmat->data.ptr + xmat->step*y : 0);
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* y_data = (float*)(ymat ? ymat->data.ptr + ymat->step*y : 0);
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* mag_data = (float*)(mag ? mag->data.ptr + mag->step*y : 0);
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float* angle_data = (float*)(angle->data.ptr + angle->step*y);
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x += block_size )
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int i, len = MIN( size.width - x, block_size );
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvSinCos_32f( angle_data+x, y_buffer, x_buffer, len, angle_in_degrees );
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < len; i++ )
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float tx = x_buffer[i];
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float ty = y_buffer[i];
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( mag_data )
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        float magval = mag_data[x+i];
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        tx *= magval;
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        ty *= magval;
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( xmat )
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        x_data[x+i] = tx;
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( ymat )
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        y_data[x+i] = ty;
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* x_data = (double*)(xmat ? xmat->data.ptr + xmat->step*y : 0);
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* y_data = (double*)(ymat ? ymat->data.ptr + ymat->step*y : 0);
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* mag_data = (double*)(mag ? mag->data.ptr + mag->step*y : 0);
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double* angle_data = (double*)(angle->data.ptr + angle->step*y);
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double C = angle_in_degrees ? CV_PI/180. : 1;
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x++ )
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double phi = angle_data[x]*C;
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double magval = mag_data ? mag_data[x] : 1.;
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( xmat )
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    x_data[x] = cos(phi)*magval;
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( ymat )
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    y_data[x] = sin(phi)*magval;
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                          E X P                                         *
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef union
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct {
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if ( defined( WORDS_BIGENDIAN ) && !defined( OPENCV_UNIVERSAL_BUILD ) ) || defined( __BIG_ENDIAN__ )
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int hi;
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int lo;
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int lo;
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int hi;
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    } i;
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double d;
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennDBLINT;
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define EXPTAB_SCALE 6
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define EXPTAB_MASK  ((1 << EXPTAB_SCALE) - 1)
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define EXPPOLY_32F_A0 .9670371139572337719125840413672004409288e-2
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const double icvExpTab[] = {
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0 * EXPPOLY_32F_A0,
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0108892860517004600204097905619 * EXPPOLY_32F_A0,
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0218971486541166782344801347833 * EXPPOLY_32F_A0,
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0330248790212284225001082839705 * EXPPOLY_32F_A0,
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0442737824274138403219664787399 * EXPPOLY_32F_A0,
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0556451783605571588083413251529 * EXPPOLY_32F_A0,
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0671404006768236181695211209928 * EXPPOLY_32F_A0,
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0787607977571197937406800374385 * EXPPOLY_32F_A0,
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.0905077326652576592070106557607 * EXPPOLY_32F_A0,
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.1023825833078409435564142094256 * EXPPOLY_32F_A0,
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.1143867425958925363088129569196 * EXPPOLY_32F_A0,
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.126521618608241899794798643787 * EXPPOLY_32F_A0,
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.1387886347566916537038302838415 * EXPPOLY_32F_A0,
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.151189229952982705817759635202 * EXPPOLY_32F_A0,
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.1637248587775775138135735990922 * EXPPOLY_32F_A0,
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.1763969916502812762846457284838 * EXPPOLY_32F_A0,
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.1892071150027210667174999705605 * EXPPOLY_32F_A0,
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2021567314527031420963969574978 * EXPPOLY_32F_A0,
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2152473599804688781165202513388 * EXPPOLY_32F_A0,
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2284805361068700056940089577928 * EXPPOLY_32F_A0,
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2418578120734840485936774687266 * EXPPOLY_32F_A0,
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2553807570246910895793906574423 * EXPPOLY_32F_A0,
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2690509571917332225544190810323 * EXPPOLY_32F_A0,
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2828700160787782807266697810215 * EXPPOLY_32F_A0,
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.2968395546510096659337541177925 * EXPPOLY_32F_A0,
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3109612115247643419229917863308 * EXPPOLY_32F_A0,
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3252366431597412946295370954987 * EXPPOLY_32F_A0,
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3396675240533030053600306697244 * EXPPOLY_32F_A0,
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3542555469368927282980147401407 * EXPPOLY_32F_A0,
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3690024229745906119296011329822 * EXPPOLY_32F_A0,
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3839098819638319548726595272652 * EXPPOLY_32F_A0,
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.3989796725383111402095281367152 * EXPPOLY_32F_A0,
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.4142135623730950488016887242097 * EXPPOLY_32F_A0,
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.4296133383919700112350657782751 * EXPPOLY_32F_A0,
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.4451808069770466200370062414717 * EXPPOLY_32F_A0,
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.4609177941806469886513028903106 * EXPPOLY_32F_A0,
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.476826145939499311386907480374 * EXPPOLY_32F_A0,
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.4929077282912648492006435314867 * EXPPOLY_32F_A0,
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.5091644275934227397660195510332 * EXPPOLY_32F_A0,
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.5255981507445383068512536895169 * EXPPOLY_32F_A0,
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.5422108254079408236122918620907 * EXPPOLY_32F_A0,
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.5590044002378369670337280894749 * EXPPOLY_32F_A0,
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.5759808451078864864552701601819 * EXPPOLY_32F_A0,
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.5931421513422668979372486431191 * EXPPOLY_32F_A0,
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.6104903319492543081795206673574 * EXPPOLY_32F_A0,
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.628027421857347766848218522014 * EXPPOLY_32F_A0,
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.6457554781539648445187567247258 * EXPPOLY_32F_A0,
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.6636765803267364350463364569764 * EXPPOLY_32F_A0,
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.6817928305074290860622509524664 * EXPPOLY_32F_A0,
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.7001063537185234695013625734975 * EXPPOLY_32F_A0,
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.7186192981224779156293443764563 * EXPPOLY_32F_A0,
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.7373338352737062489942020818722 * EXPPOLY_32F_A0,
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.7562521603732994831121606193753 * EXPPOLY_32F_A0,
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.7753764925265212525505592001993 * EXPPOLY_32F_A0,
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.7947090750031071864277032421278 * EXPPOLY_32F_A0,
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.8142521755003987562498346003623 * EXPPOLY_32F_A0,
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.8340080864093424634870831895883 * EXPPOLY_32F_A0,
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.8539791250833855683924530703377 * EXPPOLY_32F_A0,
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.8741676341102999013299989499544 * EXPPOLY_32F_A0,
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.8945759815869656413402186534269 * EXPPOLY_32F_A0,
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.9152065613971472938726112702958 * EXPPOLY_32F_A0,
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.9360617934922944505980559045667 * EXPPOLY_32F_A0,
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.9571441241754002690183222516269 * EXPPOLY_32F_A0,
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.9784560263879509682582499181312 * EXPPOLY_32F_A0,
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const double exp_prescale = 1.4426950408889634073599246810019 * (1 << EXPTAB_SCALE);
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const double exp_postscale = 1./(1 << EXPTAB_SCALE);
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const double exp_max_val = 3000.*(1 << EXPTAB_SCALE); // log10(DBL_MAX) < 3000
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvExp_32f, ( const float *_x, float *y, int n ), (_x, y, n) )
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXPPOLY_32F_A4 = 1.000000000000002438532970795181890933776 / EXPPOLY_32F_A0,
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXPPOLY_32F_A3 = .6931471805521448196800669615864773144641 / EXPPOLY_32F_A0,
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXPPOLY_32F_A2 = .2402265109513301490103372422686535526573 / EXPPOLY_32F_A0,
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        EXPPOLY_32F_A1 = .5550339366753125211915322047004666939128e-1 / EXPPOLY_32F_A0;
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #undef EXPPOLY
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define EXPPOLY(x)  \
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (((((x) + EXPPOLY_32F_A1)*(x) + EXPPOLY_32F_A2)*(x) + EXPPOLY_32F_A3)*(x) + EXPPOLY_32F_A4)
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    DBLINT buf[4];
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const Cv32suf* x = (const Cv32suf*)_x;
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !x || !y )
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( n <= 0 )
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buf[0].i.lo = buf[1].i.lo = buf[2].i.lo = buf[3].i.lo = 0;
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i <= n - 4; i += 4 )
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0 = x[i].f * exp_prescale;
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x1 = x[i + 1].f * exp_prescale;
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x2 = x[i + 2].f * exp_prescale;
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x3 = x[i + 3].f * exp_prescale;
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int val0, val1, val2, val3, t;
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ((x[i].i >> 23) & 255) > 127 + 10 )
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x0 = x[i].i < 0 ? -exp_max_val : exp_max_val;
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ((x[i+1].i >> 23) & 255) > 127 + 10 )
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x1 = x[i+1].i < 0 ? -exp_max_val : exp_max_val;
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ((x[i+2].i >> 23) & 255) > 127 + 10 )
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x2 = x[i+2].i < 0 ? -exp_max_val : exp_max_val;
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ((x[i+3].i >> 23) & 255) > 127 + 10 )
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x3 = x[i+3].i < 0 ? -exp_max_val : exp_max_val;
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val0 = cvRound(x0);
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val1 = cvRound(x1);
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val2 = cvRound(x2);
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val3 = cvRound(x3);
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = (x0 - val0)*exp_postscale;
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = (x1 - val1)*exp_postscale;
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = (x2 - val2)*exp_postscale;
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x3 = (x3 - val3)*exp_postscale;
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val0 >> EXPTAB_SCALE) + 1023;
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.hi = t << 20;
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val1 >> EXPTAB_SCALE) + 1023;
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[1].i.hi = t << 20;
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val2 >> EXPTAB_SCALE) + 1023;
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[2].i.hi = t << 20;
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val3 >> EXPTAB_SCALE) + 1023;
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[3].i.hi = t << 20;
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY( x0 );
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = buf[1].d * icvExpTab[val1 & EXPTAB_MASK] * EXPPOLY( x1 );
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = (float)x0;
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 1] = (float)x1;
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = buf[2].d * icvExpTab[val2 & EXPTAB_MASK] * EXPPOLY( x2 );
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x3 = buf[3].d * icvExpTab[val3 & EXPTAB_MASK] * EXPPOLY( x3 );
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 2] = (float)x2;
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 3] = (float)x3;
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < n; i++ )
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0 = x[i].f * exp_prescale;
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int val0, t;
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ((x[i].i >> 23) & 255) > 127 + 10 )
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x0 = x[i].i < 0 ? -exp_max_val : exp_max_val;
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val0 = cvRound(x0);
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val0 >> EXPTAB_SCALE) + 1023;
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.hi = t << 20;
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = (x0 - val0)*exp_postscale;
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = (float)(buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY(x0));
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvExp_64f, ( const double *_x, double *y, int n ), (_x, y, n) )
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A5 = .99999999999999999998285227504999 / EXPPOLY_32F_A0,
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A4 = .69314718055994546743029643825322 / EXPPOLY_32F_A0,
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A3 = .24022650695886477918181338054308 / EXPPOLY_32F_A0,
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A2 = .55504108793649567998466049042729e-1 / EXPPOLY_32F_A0,
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A1 = .96180973140732918010002372686186e-2 / EXPPOLY_32F_A0,
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A0 = .13369713757180123244806654839424e-2 / EXPPOLY_32F_A0;
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #undef EXPPOLY
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define EXPPOLY(x)  (((((A0*(x) + A1)*(x) + A2)*(x) + A3)*(x) + A4)*(x) + A5)
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    DBLINT buf[4];
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const Cv64suf* x = (const Cv64suf*)_x;
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !x || !y )
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( n <= 0 )
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buf[0].i.lo = buf[1].i.lo = buf[2].i.lo = buf[3].i.lo = 0;
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i <= n - 4; i += 4 )
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0 = x[i].f * exp_prescale;
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x1 = x[i + 1].f * exp_prescale;
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x2 = x[i + 2].f * exp_prescale;
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x3 = x[i + 3].f * exp_prescale;
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double y0, y1, y2, y3;
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int val0, val1, val2, val3, t;
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (int)(x[i].i >> 52);
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (t & 2047) > 1023 + 10 )
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x0 = t < 0 ? -exp_max_val : exp_max_val;
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (int)(x[i+1].i >> 52);
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (t & 2047) > 1023 + 10 )
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x1 = t < 0 ? -exp_max_val : exp_max_val;
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (int)(x[i+2].i >> 52);
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (t & 2047) > 1023 + 10 )
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x2 = t < 0 ? -exp_max_val : exp_max_val;
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (int)(x[i+3].i >> 52);
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (t & 2047) > 1023 + 10 )
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x3 = t < 0 ? -exp_max_val : exp_max_val;
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val0 = cvRound(x0);
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val1 = cvRound(x1);
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val2 = cvRound(x2);
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val3 = cvRound(x3);
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = (x0 - val0)*exp_postscale;
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = (x1 - val1)*exp_postscale;
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = (x2 - val2)*exp_postscale;
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x3 = (x3 - val3)*exp_postscale;
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val0 >> EXPTAB_SCALE) + 1023;
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.hi = t << 20;
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val1 >> EXPTAB_SCALE) + 1023;
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[1].i.hi = t << 20;
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val2 >> EXPTAB_SCALE) + 1023;
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[2].i.hi = t << 20;
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val3 >> EXPTAB_SCALE) + 1023;
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[3].i.hi = t << 20;
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 = buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY( x0 );
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 = buf[1].d * icvExpTab[val1 & EXPTAB_MASK] * EXPPOLY( x1 );
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = y0;
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 1] = y1;
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 = buf[2].d * icvExpTab[val2 & EXPTAB_MASK] * EXPPOLY( x2 );
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 = buf[3].d * icvExpTab[val3 & EXPTAB_MASK] * EXPPOLY( x3 );
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 2] = y2;
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 3] = y3;
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < n; i++ )
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0 = x[i].f * exp_prescale;
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int val0, t;
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (int)(x[i].i >> 52);
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (t & 2047) > 1023 + 10 )
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x0 = t < 0 ? -exp_max_val : exp_max_val;
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        val0 = cvRound(x0);
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (val0 >> EXPTAB_SCALE) + 1023;
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047);
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.hi = t << 20;
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = (x0 - val0)*exp_postscale;
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY( x0 );
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef EXPTAB_SCALE
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef EXPTAB_MASK
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef EXPPOLY_32F_A0
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void cvExp( const CvArr* srcarr, CvArr* dstarr )
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvExp" );
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0, src_depth, dst_depth;
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double* buffer = 0;
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y, dx = 0;
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src))
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst))
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 )
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_depth = CV_MAT_DEPTH(src->type);
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_depth = CV_MAT_DEPTH(dst->type);
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_CNS_EQ( src, dst ) || src_depth < CV_32F || dst_depth < src_depth )
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ) )
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize(src);
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN(src->type);
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src->type & dst->type ))
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_DEPTHS_EQ( src, dst ))
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dx = MIN( 1024, size.width );
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer = (double*)cvStackAlloc( dx*sizeof(buffer[0]) );
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < size.height; y++ )
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* src_data = src->data.ptr + src->step*y;
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* dst_data = dst->data.ptr + dst->step*y;
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_depth == CV_64F )
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvExp_64f( (double*)src_data, (double*)dst_data, size.width );
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( src_depth == dst_depth )
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvExp_32f( (float*)src_data, (float*)dst_data, size.width );
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x += dx )
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = dx;
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( x + len > size.width )
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    len = size.width - x;
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvCvt_32f64f( (float*)src_data + x, buffer, len );
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvExp_64f( buffer, (double*)dst_data + x, len );
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                          L O G                                         *
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOGTAB_SCALE    8
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOGTAB_MASK         ((1 << LOGTAB_SCALE) - 1)
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOGTAB_MASK2        ((1 << (20 - LOGTAB_SCALE)) - 1)
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOGTAB_MASK2_32F    ((1 << (23 - LOGTAB_SCALE)) - 1)
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const double icvLogTab[] = {
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn0.0000000000000000000000000000000000000000,    1.000000000000000000000000000000000000000,
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.00389864041565732288852075271279318258166,    .9961089494163424124513618677042801556420,
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.00778214044205494809292034119607706088573,    .9922480620155038759689922480620155038760,
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.01165061721997527263705585198749759001657,    .9884169884169884169884169884169884169884,
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.01550418653596525274396267235488267033361,    .9846153846153846153846153846153846153846,
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.01934296284313093139406447562578250654042,    .9808429118773946360153256704980842911877,
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.02316705928153437593630670221500622574241,    .9770992366412213740458015267175572519084,
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.02697658769820207233514075539915211265906,    .9733840304182509505703422053231939163498,
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.03077165866675368732785500469617545604706,    .9696969696969696969696969696969696969697,
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.03455238150665972812758397481047722976656,    .9660377358490566037735849056603773584906,
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.03831886430213659461285757856785494368522,    .9624060150375939849624060150375939849624,
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.04207121392068705056921373852674150839447,    .9588014981273408239700374531835205992509,
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.04580953603129420126371940114040626212953,    .9552238805970149253731343283582089552239,
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.04953393512227662748292900118940451648088,    .9516728624535315985130111524163568773234,
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.05324451451881227759255210685296333394944,    .9481481481481481481481481481481481481481,
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.05694137640013842427411105973078520037234,    .9446494464944649446494464944649446494465,
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.06062462181643483993820353816772694699466,    .9411764705882352941176470588235294117647,
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.06429435070539725460836422143984236754475,    .9377289377289377289377289377289377289377,
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.06795066190850773679699159401934593915938,    .9343065693430656934306569343065693430657,
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.07159365318700880442825962290953611955044,    .9309090909090909090909090909090909090909,
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.07522342123758751775142172846244648098944,    .9275362318840579710144927536231884057971,
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.07884006170777602129362549021607264876369,    .9241877256317689530685920577617328519856,
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.08244366921107458556772229485432035289706,    .9208633093525179856115107913669064748201,
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.08603433734180314373940490213499288074675,    .9175627240143369175627240143369175627240,
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.08961215868968712416897659522874164395031,    .9142857142857142857142857142857142857143,
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.09317722485418328259854092721070628613231,    .9110320284697508896797153024911032028470,
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.09672962645855109897752299730200320482256,    .9078014184397163120567375886524822695035,
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.10026945316367513738597949668474029749630,    .9045936395759717314487632508833922261484,
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.10379679368164355934833764649738441221420,    .9014084507042253521126760563380281690141,
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.10731173578908805021914218968959175981580,    .8982456140350877192982456140350877192982,
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.11081436634029011301105782649756292812530,    .8951048951048951048951048951048951048951,
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.11430477128005862852422325204315711744130,    .8919860627177700348432055749128919860627,
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.11778303565638344185817487641543266363440,    .8888888888888888888888888888888888888889,
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.12124924363286967987640707633545389398930,    .8858131487889273356401384083044982698962,
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.12470347850095722663787967121606925502420,    .8827586206896551724137931034482758620690,
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.12814582269193003360996385708858724683530,    .8797250859106529209621993127147766323024,
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.13157635778871926146571524895989568904040,    .8767123287671232876712328767123287671233,
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.13499516453750481925766280255629681050780,    .8737201365187713310580204778156996587031,
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.13840232285911913123754857224412262439730,    .8707482993197278911564625850340136054422,
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.14179791186025733629172407290752744302150,    .8677966101694915254237288135593220338983,
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.14518200984449788903951628071808954700830,    .8648648648648648648648648648648648648649,
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.14855469432313711530824207329715136438610,    .8619528619528619528619528619528619528620,
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.15191604202584196858794030049466527998450,    .8590604026845637583892617449664429530201,
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.15526612891112392955683674244937719777230,    .8561872909698996655518394648829431438127,
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.15860503017663857283636730244325008243330,    .8533333333333333333333333333333333333333,
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.16193282026931324346641360989451641216880,    .8504983388704318936877076411960132890365,
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.16524957289530714521497145597095368430010,    .8476821192052980132450331125827814569536,
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.16855536102980664403538924034364754334090,    .8448844884488448844884488448844884488449,
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.17185025692665920060697715143760433420540,    .8421052631578947368421052631578947368421,
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.17513433212784912385018287750426679849630,    .8393442622950819672131147540983606557377,
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.17840765747281828179637841458315961062910,    .8366013071895424836601307189542483660131,
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.18167030310763465639212199675966985523700,    .8338762214983713355048859934853420195440,
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.18492233849401198964024217730184318497780,    .8311688311688311688311688311688311688312,
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.18816383241818296356839823602058459073300,    .8284789644012944983818770226537216828479,
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.19139485299962943898322009772527962923050,    .8258064516129032258064516129032258064516,
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.19461546769967164038916962454095482826240,    .8231511254019292604501607717041800643087,
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.19782574332991986754137769821682013571260,    .8205128205128205128205128205128205128205,
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.20102574606059073203390141770796617493040,    .8178913738019169329073482428115015974441,
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.20421554142869088876999228432396193966280,    .8152866242038216560509554140127388535032,
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.20739519434607056602715147164417430758480,    .8126984126984126984126984126984126984127,
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.21056476910734961416338251183333341032260,    .8101265822784810126582278481012658227848,
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.21372432939771812687723695489694364368910,    .8075709779179810725552050473186119873817,
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.21687393830061435506806333251006435602900,    .8050314465408805031446540880503144654088,
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.22001365830528207823135744547471404075630,    .8025078369905956112852664576802507836991,
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.22314355131420973710199007200571941211830,    .8000000000000000000000000000000000000000,
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.22626367865045338145790765338460914790630,    .7975077881619937694704049844236760124611,
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.22937410106484582006380890106811420992010,    .7950310559006211180124223602484472049689,
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.23247487874309405442296849741978803649550,    .7925696594427244582043343653250773993808,
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.23556607131276688371634975283086532726890,    .7901234567901234567901234567901234567901,
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.23864773785017498464178231643018079921600,    .7876923076923076923076923076923076923077,
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.24171993688714515924331749374687206000090,    .7852760736196319018404907975460122699387,
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.24478272641769091566565919038112042471760,    .7828746177370030581039755351681957186544,
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.24783616390458124145723672882013488560910,    .7804878048780487804878048780487804878049,
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.25088030628580937353433455427875742316250,    .7781155015197568389057750759878419452888,
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.25391520998096339667426946107298135757450,    .7757575757575757575757575757575757575758,
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.25694093089750041913887912414793390780680,    .7734138972809667673716012084592145015106,
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.25995752443692604627401010475296061486000,    .7710843373493975903614457831325301204819,
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.26296504550088134477547896494797896593800,    .7687687687687687687687687687687687687688,
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.26596354849713793599974565040611196309330,    .7664670658682634730538922155688622754491,
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.26895308734550393836570947314612567424780,    .7641791044776119402985074626865671641791,
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.27193371548364175804834985683555714786050,    .7619047619047619047619047619047619047619,
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.27490548587279922676529508862586226314300,    .7596439169139465875370919881305637982196,
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.27786845100345625159121709657483734190480,    .7573964497041420118343195266272189349112,
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.28082266290088775395616949026589281857030,    .7551622418879056047197640117994100294985,
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.28376817313064456316240580235898960381750,    .7529411764705882352941176470588235294118,
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.28670503280395426282112225635501090437180,    .7507331378299120234604105571847507331378,
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.28963329258304265634293983566749375313530,    .7485380116959064327485380116959064327485,
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.29255300268637740579436012922087684273730,    .7463556851311953352769679300291545189504,
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.29546421289383584252163927885703742504130,    .7441860465116279069767441860465116279070,
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.29836697255179722709783618483925238251680,    .7420289855072463768115942028985507246377,
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.30126133057816173455023545102449133992200,    .7398843930635838150289017341040462427746,
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.30414733546729666446850615102448500692850,    .7377521613832853025936599423631123919308,
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.30702503529491181888388950937951449304830,    .7356321839080459770114942528735632183908,
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.30989447772286465854207904158101882785550,    .7335243553008595988538681948424068767908,
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.31275571000389684739317885942000430077330,    .7314285714285714285714285714285714285714,
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.31560877898630329552176476681779604405180,    .7293447293447293447293447293447293447293,
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.31845373111853458869546784626436419785030,    .7272727272727272727272727272727272727273,
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.32129061245373424782201254856772720813750,    .7252124645892351274787535410764872521246,
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.32411946865421192853773391107097268104550,    .7231638418079096045197740112994350282486,
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.32694034499585328257253991068864706903700,    .7211267605633802816901408450704225352113,
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.32975328637246797969240219572384376078850,    .7191011235955056179775280898876404494382,
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.33255833730007655635318997155991382896900,    .7170868347338935574229691876750700280112,
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.33535554192113781191153520921943709254280,    .7150837988826815642458100558659217877095,
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.33814494400871636381467055798566434532400,    .7130919220055710306406685236768802228412,
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.34092658697059319283795275623560883104800,    .7111111111111111111111111111111111111111,
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.34370051385331840121395430287520866841080,    .7091412742382271468144044321329639889197,
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.34646676734620857063262633346312213689100,    .7071823204419889502762430939226519337017,
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.34922538978528827602332285096053965389730,    .7052341597796143250688705234159779614325,
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.35197642315717814209818925519357435405250,    .7032967032967032967032967032967032967033,
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.35471990910292899856770532096561510115850,    .7013698630136986301369863013698630136986,
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.35745588892180374385176833129662554711100,    .6994535519125683060109289617486338797814,
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.36018440357500774995358483465679455548530,    .6975476839237057220708446866485013623978,
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.36290549368936841911903457003063522279280,    .6956521739130434782608695652173913043478,
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.36561919956096466943762379742111079394830,    .6937669376693766937669376693766937669377,
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.36832556115870762614150635272380895912650,    .6918918918918918918918918918918918918919,
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.37102461812787262962487488948681857436900,    .6900269541778975741239892183288409703504,
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.37371640979358405898480555151763837784530,    .6881720430107526881720430107526881720430,
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.37640097516425302659470730759494472295050,    .6863270777479892761394101876675603217158,
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.37907835293496944251145919224654790014030,    .6844919786096256684491978609625668449198,
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.38174858149084833769393299007788300514230,    .6826666666666666666666666666666666666667,
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.38441169891033200034513583887019194662580,    .6808510638297872340425531914893617021277,
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.38706774296844825844488013899535872042180,    .6790450928381962864721485411140583554377,
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.38971675114002518602873692543653305619950,    .6772486772486772486772486772486772486772,
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.39235876060286384303665840889152605086580,    .6754617414248021108179419525065963060686,
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.39499380824086893770896722344332374632350,    .6736842105263157894736842105263157894737,
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.39762193064713846624158577469643205404280,    .6719160104986876640419947506561679790026,
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.40024316412701266276741307592601515352730,    .6701570680628272251308900523560209424084,
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.40285754470108348090917615991202183067800,    .6684073107049608355091383812010443864230,
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.40546510810816432934799991016916465014230,    .6666666666666666666666666666666666666667,
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.40806588980822172674223224930756259709600,    .6649350649350649350649350649350649350649,
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.41065992498526837639616360320360399782650,    .6632124352331606217616580310880829015544,
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.41324724855021932601317757871584035456180,    .6614987080103359173126614987080103359173,
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.41582789514371093497757669865677598863850,    .6597938144329896907216494845360824742268,
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.41840189913888381489925905043492093682300,    .6580976863753213367609254498714652956298,
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.42096929464412963239894338585145305842150,    .6564102564102564102564102564102564102564,
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.42353011550580327293502591601281892508280,    .6547314578005115089514066496163682864450,
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.42608439531090003260516141381231136620050,    .6530612244897959183673469387755102040816,
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.42863216738969872610098832410585600882780,    .6513994910941475826972010178117048346056,
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.43117346481837132143866142541810404509300,    .6497461928934010152284263959390862944162,
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.43370832042155937902094819946796633303180,    .6481012658227848101265822784810126582278,
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.43623676677491801667585491486534010618930,    .6464646464646464646464646464646464646465,
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.43875883620762790027214350629947148263450,    .6448362720403022670025188916876574307305,
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.44127456080487520440058801796112675219780,    .6432160804020100502512562814070351758794,
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.44378397241030093089975139264424797147500,    .6416040100250626566416040100250626566416,
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.44628710262841947420398014401143882423650,    .6400000000000000000000000000000000000000,
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.44878398282700665555822183705458883196130,    .6384039900249376558603491271820448877805,
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.45127464413945855836729492693848442286250,    .6368159203980099502487562189054726368159,
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.45375911746712049854579618113348260521900,    .6352357320099255583126550868486352357320,
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.45623743348158757315857769754074979573500,    .6336633663366336633663366336633663366337,
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.45870962262697662081833982483658473938700,    .6320987654320987654320987654320987654321,
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.46117571512217014895185229761409573256980,    .6305418719211822660098522167487684729064,
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.46363574096303250549055974261136725544930,    .6289926289926289926289926289926289926290,
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.46608972992459918316399125615134835243230,    .6274509803921568627450980392156862745098,
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.46853771156323925639597405279346276074650,    .6259168704156479217603911980440097799511,
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.47097971521879100631480241645476780831830,    .6243902439024390243902439024390243902439,
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.47341577001667212165614273544633761048330,    .6228710462287104622871046228710462287105,
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.47584590486996386493601107758877333253630,    .6213592233009708737864077669902912621359,
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.47827014848147025860569669930555392056700,    .6198547215496368038740920096852300242131,
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.48068852934575190261057286988943815231330,    .6183574879227053140096618357487922705314,
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.48310107575113581113157579238759353756900,    .6168674698795180722891566265060240963855,
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.48550781578170076890899053978500887751580,    .6153846153846153846153846153846153846154,
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.48790877731923892879351001283794175833480,    .6139088729016786570743405275779376498801,
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.49030398804519381705802061333088204264650,    .6124401913875598086124401913875598086124,
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.49269347544257524607047571407747454941280,    .6109785202863961813842482100238663484487,
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.49507726679785146739476431321236304938800,    .6095238095238095238095238095238095238095,
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.49745538920281889838648226032091770321130,    .6080760095011876484560570071258907363420,
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.49982786955644931126130359189119189977650,    .6066350710900473933649289099526066350711,
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.50219473456671548383667413872899487614650,    .6052009456264775413711583924349881796690,
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.50455601075239520092452494282042607665050,    .6037735849056603773584905660377358490566,
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.50691172444485432801997148999362252652650,    .6023529411764705882352941176470588235294,
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.50926190178980790257412536448100581765150,    .6009389671361502347417840375586854460094,
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.51160656874906207391973111953120678663250,    .5995316159250585480093676814988290398126,
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.51394575110223428282552049495279788970950,    .5981308411214953271028037383177570093458,
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.51627947444845445623684554448118433356300,    .5967365967365967365967365967365967365967,
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.51860776420804555186805373523384332656850,    .5953488372093023255813953488372093023256,
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.52093064562418522900344441950437612831600,    .5939675174013921113689095127610208816705,
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.52324814376454775732838697877014055848100,    .5925925925925925925925925925925925925926,
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.52556028352292727401362526507000438869000,    .5912240184757505773672055427251732101617,
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.52786708962084227803046587723656557500350,    .5898617511520737327188940092165898617512,
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.53016858660912158374145519701414741575700,    .5885057471264367816091954022988505747126,
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.53246479886947173376654518506256863474850,    .5871559633027522935779816513761467889908,
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.53475575061602764748158733709715306758900,    .5858123569794050343249427917620137299771,
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.53704146589688361856929077475797384977350,    .5844748858447488584474885844748858447489,
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.53932196859560876944783558428753167390800,    .5831435079726651480637813211845102505695,
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.54159728243274429804188230264117009937750,    .5818181818181818181818181818181818181818,
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.54386743096728351609669971367111429572100,    .5804988662131519274376417233560090702948,
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.54613243759813556721383065450936555862450,    .5791855203619909502262443438914027149321,
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.54839232556557315767520321969641372561450,    .5778781038374717832957110609480812641084,
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.55064711795266219063194057525834068655950,    .5765765765765765765765765765765765765766,
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.55289683768667763352766542084282264113450,    .5752808988764044943820224719101123595506,
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.55514150754050151093110798683483153581600,    .5739910313901345291479820627802690582960,
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.55738115013400635344709144192165695130850,    .5727069351230425055928411633109619686801,
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.55961578793542265941596269840374588966350,    .5714285714285714285714285714285714285714,
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.56184544326269181269140062795486301183700,    .5701559020044543429844097995545657015590,
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.56407013828480290218436721261241473257550,    .5688888888888888888888888888888888888889,
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.56628989502311577464155334382667206227800,    .5676274944567627494456762749445676274945,
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.56850473535266865532378233183408156037350,    .5663716814159292035398230088495575221239,
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.57071468100347144680739575051120482385150,    .5651214128035320088300220750551876379691,
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.57291975356178548306473885531886480748650,    .5638766519823788546255506607929515418502,
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.57511997447138785144460371157038025558000,    .5626373626373626373626373626373626373626,
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.57731536503482350219940144597785547375700,    .5614035087719298245614035087719298245614,
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.57950594641464214795689713355386629700650,    .5601750547045951859956236323851203501094,
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.58169173963462239562716149521293118596100,    .5589519650655021834061135371179039301310,
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.58387276558098266665552955601015128195300,    .5577342047930283224400871459694989106754,
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.58604904500357812846544902640744112432000,    .5565217391304347826086956521739130434783,
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.58822059851708596855957011939608491957200,    .5553145336225596529284164859002169197397,
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.59038744660217634674381770309992134571100,    .5541125541125541125541125541125541125541,
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.59254960960667157898740242671919986605650,    .5529157667386609071274298056155507559395,
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.59470710774669277576265358220553025603300,    .5517241379310344827586206896551724137931,
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.59685996110779382384237123915227130055450,    .5505376344086021505376344086021505376344,
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.59900818964608337768851242799428291618800,    .5493562231759656652360515021459227467811,
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.60115181318933474940990890900138765573500,    .5481798715203426124197002141327623126338,
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.60329085143808425240052883964381180703650,    .5470085470085470085470085470085470085470,
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.60542532396671688843525771517306566238400,    .5458422174840085287846481876332622601279,
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.60755525022454170969155029524699784815300,    .5446808510638297872340425531914893617021,
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.60968064953685519036241657886421307921400,    .5435244161358811040339702760084925690021,
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.61180154110599282990534675263916142284850,    .5423728813559322033898305084745762711864,
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.61391794401237043121710712512140162289150,    .5412262156448202959830866807610993657505,
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.61602987721551394351138242200249806046500,    .5400843881856540084388185654008438818565,
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.61813735955507864705538167982012964785100,    .5389473684210526315789473684210526315789,
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.62024040975185745772080281312810257077200,    .5378151260504201680672268907563025210084,
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.62233904640877868441606324267922900617100,    .5366876310272536687631027253668763102725,
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.62443328801189346144440150965237990021700,    .5355648535564853556485355648535564853556,
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.62652315293135274476554741340805776417250,    .5344467640918580375782881002087682672234,
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.62860865942237409420556559780379757285100,    .5333333333333333333333333333333333333333,
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.63068982562619868570408243613201193511500,    .5322245322245322245322245322245322245322,
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.63276666957103777644277897707070223987100,    .5311203319502074688796680497925311203320,
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.63483920917301017716738442686619237065300,    .5300207039337474120082815734989648033126,
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.63690746223706917739093569252872839570050,    .5289256198347107438016528925619834710744,
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.63897144645792069983514238629140891134750,    .5278350515463917525773195876288659793814,
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.64103117942093124081992527862894348800200,    .5267489711934156378600823045267489711934,
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.64308667860302726193566513757104985415950,    .5256673511293634496919917864476386036961,
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.64513796137358470073053240412264131009600,    .5245901639344262295081967213114754098361,
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.64718504499530948859131740391603671014300,    .5235173824130879345603271983640081799591,
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.64922794662510974195157587018911726772800,    .5224489795918367346938775510204081632653,
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.65126668331495807251485530287027359008800,    .5213849287169042769857433808553971486762,
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.65330127201274557080523663898929953575150,    .5203252032520325203252032520325203252033,
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.65533172956312757406749369692988693714150,    .5192697768762677484787018255578093306288,
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.65735807270835999727154330685152672231200,    .5182186234817813765182186234817813765182,
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.65938031808912778153342060249997302889800,    .5171717171717171717171717171717171717172,
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.66139848224536490484126716182800009846700,    .5161290322580645161290322580645161290323,
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.66341258161706617713093692145776003599150,    .5150905432595573440643863179074446680080,
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.66542263254509037562201001492212526500250,    .5140562248995983935742971887550200803213,
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.66742865127195616370414654738851822912700,    .5130260521042084168336673346693386773547,
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.66943065394262923906154583164607174694550,    .5120000000000000000000000000000000000000,
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.67142865660530226534774556057527661323550,    .5109780439121756487025948103792415169661,
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.67342267521216669923234121597488410770900,    .5099601593625498007968127490039840637450,
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.67541272562017662384192817626171745359900,    .5089463220675944333996023856858846918489,
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.67739882359180603188519853574689477682100,    .5079365079365079365079365079365079365079,
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.67938098479579733801614338517538271844400,    .5069306930693069306930693069306930693069,
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.68135922480790300781450241629499942064300,    .5059288537549407114624505928853754940711,
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.68333355911162063645036823800182901322850,    .5049309664694280078895463510848126232742,
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.68530400309891936760919861626462079584600,    .5039370078740157480314960629921259842520,
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.68727057207096020619019327568821609020250,    .5029469548133595284872298624754420432220,
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.68923328123880889251040571252815425395950,    .5019607843137254901960784313725490196078,
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn.69314718055994530941723212145818, 5.0e-01,
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define LOGTAB_TRANSLATE(x,h) (((x) - 1.)*icvLogTab[(h)+1])
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const double ln_2 = 0.69314718055994530941723212145818;
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvLog_32f, ( const float *_x, float *y, int n ), (_x, y, n) )
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double shift[] = { 0, -1./512 };
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A0 = 0.3333333333333333333333333,
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A1 = -0.5,
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A2 = 1;
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #undef LOGPOLY
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define LOGPOLY(x,k) ((x)+=shift[k],((A0*(x) + A1)*(x) + A2)*(x))
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float f;
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buf[4];
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int* x = (const int*)_x;
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !x || !y )
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( n <= 0 )
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i <= n - 4; i += 4 )
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0, x1, x2, x3;
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double y0, y1, y2, y3;
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int h0, h1, h2, h3;
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = x[i];
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h1 = x[i+1];
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i = (h0 & LOGTAB_MASK2_32F) | (127 << 23);
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[1].i = (h1 & LOGTAB_MASK2_32F) | (127 << 23);
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 = (((h0 >> 23) & 0xff) - 127) * ln_2;
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 = (((h1 >> 23) & 0xff) - 127) * ln_2;
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = (h0 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h1 = (h1 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += icvLogTab[h0];
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 += icvLogTab[h1];
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h2 = x[i+2];
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h3 = x[i+3];
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = LOGTAB_TRANSLATE( buf[0].f, h0 );
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = LOGTAB_TRANSLATE( buf[1].f, h1 );
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[2].i = (h2 & LOGTAB_MASK2_32F) | (127 << 23);
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[3].i = (h3 & LOGTAB_MASK2_32F) | (127 << 23);
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 = (((h2 >> 23) & 0xff) - 127) * ln_2;
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 = (((h3 >> 23) & 0xff) - 127) * ln_2;
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h2 = (h2 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h3 = (h3 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 += icvLogTab[h2];
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 += icvLogTab[h3];
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = LOGTAB_TRANSLATE( buf[2].f, h2 );
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x3 = LOGTAB_TRANSLATE( buf[3].f, h3 );
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += LOGPOLY( x0, h0 == 510 );
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 += LOGPOLY( x1, h1 == 510 );
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = (float) y0;
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 1] = (float) y1;
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 += LOGPOLY( x2, h2 == 510 );
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 += LOGPOLY( x3, h3 == 510 );
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 2] = (float) y2;
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 3] = (float) y3;
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < n; i++ )
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int h0 = x[i];
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0, y0;
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 = (((h0 >> 23) & 0xff) - 127) * ln_2;
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i = (h0 & LOGTAB_MASK2_32F) | (127 << 23);
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = (h0 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += icvLogTab[h0];
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = LOGTAB_TRANSLATE( buf[0].f, h0 );
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += LOGPOLY( x0, h0 == 510 );
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = (float)y0;
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvLog_64f, ( const double *x, double *y, int n ), (x, y, n) )
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double shift[] = { 0, -1./512 };
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const double
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A0 = -.1666666666666666666666666666666666666666,
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A1 = +0.2,
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A2 = -0.25,
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A3 = +0.3333333333333333333333333333333333333333,
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A4 = -0.5,
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        A5 = +1.0;
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #undef LOGPOLY
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define LOGPOLY(x,k) ((x)+=shift[k], (xq) = (x)*(x),\
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ((A0*(xq) + A2)*(xq) + A4)*(xq) + ((A1*(xq) + A3)*(xq) + A5)*(x))
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = 0;
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    DBLINT buf[4];
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    DBLINT *X = (DBLINT *) x;
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !x || !y )
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( n <= 0 )
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i <= n - 4; i += 4 )
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double xq;
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0, x1, x2, x3;
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double y0, y1, y2, y3;
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int h0, h1, h2, h3;
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = X[i].i.lo;
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h1 = X[i + 1].i.lo;
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.lo = h0;
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[1].i.lo = h1;
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = X[i].i.hi;
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h1 = X[i + 1].i.hi;
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.hi = (h0 & LOGTAB_MASK2) | (1023 << 20);
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[1].i.hi = (h1 & LOGTAB_MASK2) | (1023 << 20);
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 = (((h0 >> 20) & 0x7ff) - 1023) * ln_2;
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 = (((h1 >> 20) & 0x7ff) - 1023) * ln_2;
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h2 = X[i + 2].i.lo;
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h3 = X[i + 3].i.lo;
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[2].i.lo = h2;
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[3].i.lo = h3;
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = (h0 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h1 = (h1 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += icvLogTab[h0];
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 += icvLogTab[h1];
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h2 = X[i + 2].i.hi;
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h3 = X[i + 3].i.hi;
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = LOGTAB_TRANSLATE( buf[0].d, h0 );
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x1 = LOGTAB_TRANSLATE( buf[1].d, h1 );
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[2].i.hi = (h2 & LOGTAB_MASK2) | (1023 << 20);
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[3].i.hi = (h3 & LOGTAB_MASK2) | (1023 << 20);
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 = (((h2 >> 20) & 0x7ff) - 1023) * ln_2;
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 = (((h3 >> 20) & 0x7ff) - 1023) * ln_2;
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h2 = (h2 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h3 = (h3 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 += icvLogTab[h2];
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 += icvLogTab[h3];
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x2 = LOGTAB_TRANSLATE( buf[2].d, h2 );
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x3 = LOGTAB_TRANSLATE( buf[3].d, h3 );
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += LOGPOLY( x0, h0 == 510 );
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y1 += LOGPOLY( x1, h1 == 510 );
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = y0;
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 1] = y1;
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y2 += LOGPOLY( x2, h2 == 510 );
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y3 += LOGPOLY( x3, h3 == 510 );
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 2] = y2;
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i + 3] = y3;
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; i < n; i++ )
15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int h0 = X[i].i.hi;
15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double xq;
15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double x0, y0 = (((h0 >> 20) & 0x7ff) - 1023) * ln_2;
15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.hi = (h0 & LOGTAB_MASK2) | (1023 << 20);
15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf[0].i.lo = X[i].i.lo;
15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        h0 = (h0 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2;
15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += icvLogTab[h0];
15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        x0 = LOGTAB_TRANSLATE( buf[0].d, h0 );
15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y0 += LOGPOLY( x0, h0 == 510 );
15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        y[i] = y0;
15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void cvLog( const CvArr* srcarr, CvArr* dstarr )
15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvLog" );
15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0, src_depth, dst_depth;
15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double* buffer = 0;
15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y, dx = 0;
15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src))
15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst))
15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 )
15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_depth = CV_MAT_DEPTH(src->type);
16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_depth = CV_MAT_DEPTH(dst->type);
16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_CNS_EQ( src, dst ) || dst_depth < CV_32F || src_depth < dst_depth )
16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ) )
16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize(src);
16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN(src->type);
16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src->type & dst->type ))
16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_DEPTHS_EQ( src, dst ))
16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dx = MIN( 1024, size.width );
16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer = (double*)cvStackAlloc( dx*sizeof(buffer[0]) );
16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < size.height; y++ )
16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* src_data = src->data.ptr + src->step*y;
16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* dst_data = dst->data.ptr + dst->step*y;
16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( dst_depth == CV_64F )
16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvLog_64f( (double*)src_data, (double*)dst_data, size.width );
16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( src_depth == dst_depth )
16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvLog_32f( (float*)src_data, (float*)dst_data, size.width );
16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x += dx )
16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = dx;
16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( x + len > size.width )
16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    len = size.width - x;
16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvLog_64f( (double*)src_data + x, buffer, len );
16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvCvt_64f32f( buffer, (float*)dst_data + x, len );
16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                    P O W E R                                           *
16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_IPOW_OP( flavor, arrtype, worktype, cast_macro )                    \
16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                          \
16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvIPow_##flavor( const arrtype* src, arrtype* dst, int len, int power )            \
16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                                          \
16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < len; i++ )                                                      \
16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        worktype a = 1, b = src[i];                                                 \
16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int p = power;                                                              \
16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( p > 1 )                                                              \
16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( p & 1 )                                                             \
16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                a *= b;                                                             \
16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b *= b;                                                                 \
16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            p >>= 1;                                                                \
16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        a *= b;                                                                     \
16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[i] = cast_macro(a);                                                     \
16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                                   \
16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IPOW_OP( 8u, uchar, int, CV_CAST_8U )
16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IPOW_OP( 16u, ushort, int, CV_CAST_16U )
16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IPOW_OP( 16s, short, int, CV_CAST_16S )
16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IPOW_OP( 32s, int, int, CV_CAST_32S )
16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IPOW_OP( 32f, float, double, CV_CAST_32F )
16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_IPOW_OP( 64f, double, double, CV_CAST_64F )
16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvIPow_8s 0
16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_DEF_INIT_FUNC_TAB_1D( IPow )
16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvIPowFunc)( const void* src, void* dst, int len, int power );
16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvSqrtFunc)( const void* src, void* dst, int len );
16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void cvPow( const CvArr* srcarr, CvArr* dstarr, double power )
16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable ipow_tab;
17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvPow" );
17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void* temp_buffer = 0;
17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = 0;
17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi1 = 0, coi2 = 0;
17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth;
17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;
17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ipower = cvRound( power );
17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int is_ipower = 0;
17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src))
17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst))
17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi1 != 0 || coi2 != 0 )
17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, dst ))
17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ) )
17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH( src->type );
17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( fabs(ipower - power) < DBL_EPSILON )
17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !inittab )
17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvInitIPowTable( &ipow_tab );
17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            inittab = 1;
17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ipower < 0 )
17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvDiv( 0, src, dst ));
17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( ipower == -1 )
17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ipower = -ipower;
17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src = dst;
17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch( ipower )
17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 0:
17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvSet( dst, cvScalarAll(1));
17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 1:
17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvCopy( src, dst );
17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 2:
17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvMul( src, src, dst );
17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        default:
17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            is_ipower = 1;
17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( depth < CV_32F )
17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat,
17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "Fractional or negative integer power factor can be used "
17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "with floating-point types only");
17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize(src);
17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= CV_MAT_CN(src->type);
17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT( src->type & dst->type ))
17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( is_ipower )
17836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvIPowFunc pow_func = (CvIPowFunc)ipow_tab.fn_2d[depth];
17856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !pow_func )
17866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "The data type is not supported" );
17876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
17896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* src_data = src->data.ptr + src->step*y;
17916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* dst_data = dst->data.ptr + dst->step*y;
17926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pow_func( src_data, dst_data, size.width, ipower );
17946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( fabs(fabs(power) - 0.5) < DBL_EPSILON )
17976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSqrtFunc sqrt_func = power < 0 ?
17996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (depth == CV_32F ? (CvSqrtFunc)icvInvSqrt_32f : (CvSqrtFunc)icvInvSqrt_64f) :
18006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (depth == CV_32F ? (CvSqrtFunc)icvSqrt_32f : (CvSqrtFunc)icvSqrt_64f);
18016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
18036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* src_data = src->data.ptr + src->step*y;
18056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* dst_data = dst->data.ptr + dst->step*y;
18066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqrt_func( src_data, dst_data, size.width );
18086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
18096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
18116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        block_size = MIN( size.width, ICV_MATH_BLOCK_SIZE );
18136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        temp_buffer = cvStackAlloc( block_size*CV_ELEM_SIZE(depth) );
18146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++ )
18166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* src_data = src->data.ptr + src->step*y;
18186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* dst_data = dst->data.ptr + dst->step*y;
18196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x += block_size )
18216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
18226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int len = MIN( size.width - x, block_size );
18236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( depth == CV_32F )
18246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
18256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvLog_32f( (float*)src_data + x, (float*)temp_buffer, len );
18266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvScale_32f( (float*)temp_buffer, (float*)temp_buffer, len, (float)power, 0 );
18276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvExp_32f( (float*)temp_buffer, (float*)dst_data + x, len );
18286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
18296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
18306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
18316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvLog_64f( (double*)src_data + x, (double*)temp_buffer, len );
18326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvScale_64f( (double*)temp_buffer, (double*)temp_buffer, len, power, 0 );
18336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    icvExp_64f( (double*)temp_buffer, (double*)dst_data + x, len );
18346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
18356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
18366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
18376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
18406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************************** CheckArray for NaN's, Inf's *********************************/
18446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus, icvCheckArray_32f_C1R,
18466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ( const float* src, int srcstep, CvSize size, int flags, double min_val, double max_val ),
18476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     (src, srcstep, size, flags, min_val, max_val) )
18486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv32suf a, b;
18506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int ia, ib;
18516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int* isrc = (const int*)src;
18526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !src )
18546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
18556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width <= 0 || size.height <= 0 )
18576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
18586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( flags & CV_CHECK_RANGE )
18606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        a.f = (float)min_val;
18626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        b.f = (float)max_val;
18636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
18656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        a.f = -FLT_MAX;
18676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        b.f = FLT_MAX;
18686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ia = CV_TOGGLE_FLT(a.i);
18716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ib = CV_TOGGLE_FLT(b.i);
18726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(isrc[0]);
18746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; isrc += srcstep )
18756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
18776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i++ )
18786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int val = isrc[i];
18806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            val = CV_TOGGLE_FLT(val);
18816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( val < ia || val >= ib )
18836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADRANGE_ERR;
18846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
18856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
18886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI_IMPL( CvStatus,  icvCheckArray_64f_C1R,
18926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ( const double* src, int srcstep, CvSize size, int flags, double min_val, double max_val ),
18936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (src, srcstep, size, flags, min_val, max_val) )
18946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv64suf a, b;
18966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int64 ia, ib;
18976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int64* isrc = (const int64*)src;
18986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !src )
19006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
19016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width <= 0 || size.height <= 0 )
19036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
19046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( flags & CV_CHECK_RANGE )
19066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        a.f = min_val;
19086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        b.f = max_val;
19096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
19116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        a.f = -DBL_MAX;
19136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        b.f = DBL_MAX;
19146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ia = CV_TOGGLE_DBL(a.i);
19176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ib = CV_TOGGLE_DBL(b.i);
19186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(isrc[0]);
19206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; isrc += srcstep )
19216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
19236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i++ )
19246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int64 val = isrc[i];
19266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            val = CV_TOGGLE_DBL(val);
19276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( val < ia || val >= ib )
19296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return CV_BADRANGE_ERR;
19306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
19346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
19356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  int  cvCheckArr( const CvArr* arr, int flags,
19386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          double minVal, double maxVal )
19396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
19406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int result = 0;
19416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCheckArr" );
19436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
19456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( arr )
19476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = CV_OK;
19496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat stub, *mat = (CvMat*)arr;
19506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int type;
19516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSize size;
19526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT( mat ))
19546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mat = cvGetMat( mat, &stub, 0, 1 ));
19556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE( mat->type );
19576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size = cvGetMatSize( mat );
19586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= CV_MAT_CN( type );
19606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type ))
19626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= size.height;
19646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = 1;
19656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH(type) == CV_32F )
19686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = icvCheckArray_32f_C1R( mat->data.fl, mat->step, size,
19706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            flags, minVal, maxVal );
19716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( CV_MAT_DEPTH(type) == CV_64F )
19736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = icvCheckArray_64f_C1R( mat->data.db, mat->step, size,
19756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            flags, minVal, maxVal );
19766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
19786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
19806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( status < 0 )
19836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( status != CV_BADRANGE_ERR || !(flags & CV_CHECK_QUIET))
19856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsOutOfRange, "CheckArray failed" );
19866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            EXIT;
19876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    result = 1;
19916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
19936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
19956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
19966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
1999