puzzles: misc. changes and sync with upstream
This brings puzzles up-to-date with Simon's tree, along with the rockbox-specific changes I made. Note that I also got rid of some of the ugly floating-point code in rbwrappers.c and replaced it with wrappers for our fixed-point library. Change-Id: Ibfb79acb15517116a26de1c3ea89e025146b9e2e
This commit is contained in:
parent
4dd300d9f0
commit
3c514f8e20
20 changed files with 102 additions and 702 deletions
|
@ -7,6 +7,8 @@
|
|||
|
||||
#include <tlsf.h>
|
||||
|
||||
#undef STR
|
||||
|
||||
int sprintf_wrapper(char *str, const char *fmt, ...);
|
||||
char *getenv_wrapper(const char *c);
|
||||
int puts_wrapper(const char *s);
|
||||
|
@ -15,7 +17,6 @@ double cos_wrapper(double rads);
|
|||
int vsprintf_wrapper(char *s, const char *fmt, va_list ap);
|
||||
float fabs_wrapper(float n);
|
||||
float floor_wrapper(float n);
|
||||
int ftoa(char *buf, int len, float f);
|
||||
|
||||
float atan_wrapper(float x);
|
||||
float atan2_wrapper(float y, float x);
|
||||
|
@ -60,14 +61,20 @@ double acos_wrapper(double x);
|
|||
#define strchr rb->strchr
|
||||
#define strcmp rb->strcmp
|
||||
#define strcpy rb->strcpy
|
||||
#define strcspn strcspn_wrapper
|
||||
#define strlen rb->strlen
|
||||
#define strspn strspn_wrapper
|
||||
#define strtol strtol_wrapper
|
||||
#define strtoq strtoq_wrapper
|
||||
#define strtouq strtouq_wrapper
|
||||
#define vsprintf vsprintf_wrapper
|
||||
|
||||
#ifndef strcspn
|
||||
#define strcspn strcspn_wrapper
|
||||
#endif
|
||||
|
||||
#ifndef strspn /* gcc has builtin */
|
||||
#define strspn strspn_wrapper
|
||||
#endif
|
||||
|
||||
#define abs(x) ((x)<0?-(x):(x))
|
||||
|
||||
/* work around compilation error */
|
||||
|
|
|
@ -23,12 +23,6 @@ int puts_wrapper(const char *s)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ftoa(char *buf, int len, float f)
|
||||
{
|
||||
/* biggest hack ever */
|
||||
return rb->snprintf(buf, len, "%d.%06d", (int)f, (int)((f - (int)f)*1e6));
|
||||
}
|
||||
|
||||
/* fixed-point wrappers */
|
||||
static long lastphase = 0, lastsin = 0, lastcos = 0x7fffffff;
|
||||
|
||||
|
@ -93,21 +87,11 @@ float floor_wrapper(float n)
|
|||
return (int)n;
|
||||
}
|
||||
|
||||
/* Natural logarithm.
|
||||
Taken from glibc-2.8 */
|
||||
static const float
|
||||
ln2_hi = 6.9313812256e-01, /* 0x3f317180 */
|
||||
ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */
|
||||
two25 = 3.355443200e+07, /* 0x4c000000 */
|
||||
Lg1 = 6.6666668653e-01, /* 3F2AAAAB */
|
||||
Lg2 = 4.0000000596e-01, /* 3ECCCCCD */
|
||||
Lg3 = 2.8571429849e-01, /* 3E924925 */
|
||||
Lg4 = 2.2222198546e-01, /* 3E638E29 */
|
||||
Lg5 = 1.8183572590e-01, /* 3E3A3325 */
|
||||
Lg6 = 1.5313838422e-01, /* 3E1CD04F */
|
||||
Lg7 = 1.4798198640e-01; /* 3E178897 */
|
||||
|
||||
static const float zero = 0.0;
|
||||
static float rb_log(float x)
|
||||
{
|
||||
long x_f = x * 65536.0f;
|
||||
return fp16_log(x_f) / 65536.0;
|
||||
}
|
||||
|
||||
/* A union which permits us to convert between a float and a 32 bit
|
||||
int. */
|
||||
|
@ -148,71 +132,6 @@ do { \
|
|||
#define __LOp(x) *(1+(int*)x)
|
||||
#endif
|
||||
|
||||
static float rb_log(float x)
|
||||
{
|
||||
float hfsq, f, s, z, R, w, t1, t2, dk;
|
||||
int32_t k, ix, i, j;
|
||||
|
||||
GET_FLOAT_WORD(ix,x);
|
||||
|
||||
k=0;
|
||||
if (ix < 0x00800000) { /* x < 2**-126 */
|
||||
if ((ix&0x7fffffff)==0)
|
||||
return -two25/(x-x); /* log(+-0)=-inf */
|
||||
if (ix<0) return (x-x)/(x-x); /* log(-#) = NaN */
|
||||
k -= 25; x *= two25; /* subnormal number, scale up x */
|
||||
GET_FLOAT_WORD(ix,x);
|
||||
}
|
||||
if (ix >= 0x7f800000) return x+x;
|
||||
k += (ix>>23)-127;
|
||||
ix &= 0x007fffff;
|
||||
i = (ix+(0x95f64<<3))&0x800000;
|
||||
SET_FLOAT_WORD(x,ix|(i^0x3f800000)); /* normalize x or x/2 */
|
||||
k += (i>>23);
|
||||
f = x-(float)1.0;
|
||||
if((0x007fffff&(15+ix))<16) { /* |f| < 2**-20 */
|
||||
if(f==zero) {
|
||||
if(k==0)
|
||||
return zero;
|
||||
else
|
||||
{
|
||||
dk=(float)k;
|
||||
return dk*ln2_hi+dk*ln2_lo;
|
||||
}
|
||||
}
|
||||
R = f*f*((float)0.5-(float)0.33333333333333333*f);
|
||||
if(k==0)
|
||||
return f-R;
|
||||
else
|
||||
{
|
||||
dk=(float)k;
|
||||
return dk*ln2_hi-((R-dk*ln2_lo)-f);
|
||||
}
|
||||
}
|
||||
s = f/((float)2.0+f);
|
||||
dk = (float)k;
|
||||
z = s*s;
|
||||
i = ix-(0x6147a<<3);
|
||||
w = z*z;
|
||||
j = (0x6b851<<3)-ix;
|
||||
t1= w*(Lg2+w*(Lg4+w*Lg6));
|
||||
t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
|
||||
i |= j;
|
||||
R = t2+t1;
|
||||
if(i>0) {
|
||||
hfsq=(float)0.5*f*f;
|
||||
if(k==0)
|
||||
return f-(hfsq-s*(hfsq+R));
|
||||
else
|
||||
return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
|
||||
} else {
|
||||
if(k==0)
|
||||
return f-s*(f-R);
|
||||
else
|
||||
return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
|
||||
}
|
||||
}
|
||||
|
||||
union ieee754_double
|
||||
{
|
||||
double d;
|
||||
|
@ -259,573 +178,10 @@ union ieee754_double
|
|||
static const volatile float TWOM100 = 7.88860905e-31;
|
||||
static const volatile float TWO127 = 1.7014118346e+38;
|
||||
|
||||
/* Exponential function,
|
||||
taken from glibc-2.8
|
||||
As it uses double values and udefines some symbols,
|
||||
it was moved to the end of the source code */
|
||||
|
||||
#define W52 (2.22044605e-16)
|
||||
#define W55 (2.77555756e-17)
|
||||
#define W58 (3.46944695e-18)
|
||||
#define W59 (1.73472348e-18)
|
||||
#define W60 (8.67361738e-19)
|
||||
const float __exp_deltatable[178] = {
|
||||
0*W60, 16558714*W60, -10672149*W59, 1441652*W60,
|
||||
-15787963*W55, 462888*W60, 7291806*W60, 1698880*W60,
|
||||
-14375103*W58, -2021016*W60, 728829*W60, -3759654*W60,
|
||||
3202123*W60, -10916019*W58, -251570*W60, -1043086*W60,
|
||||
8207536*W60, -409964*W60, -5993931*W60, -475500*W60,
|
||||
2237522*W60, 324170*W60, -244117*W60, 32077*W60,
|
||||
123907*W60, -1019734*W60, -143*W60, 813077*W60,
|
||||
743345*W60, 462461*W60, 629794*W60, 2125066*W60,
|
||||
-2339121*W60, -337951*W60, 9922067*W60, -648704*W60,
|
||||
149407*W60, -2687209*W60, -631608*W60, 2128280*W60,
|
||||
-4882082*W60, 2001360*W60, 175074*W60, 2923216*W60,
|
||||
-538947*W60, -1212193*W60, -1920926*W60, -1080577*W60,
|
||||
3690196*W60, 2643367*W60, 2911937*W60, 671455*W60,
|
||||
-1128674*W60, 593282*W60, -5219347*W60, -1941490*W60,
|
||||
11007953*W60, 239609*W60, -2969658*W60, -1183650*W60,
|
||||
942998*W60, 699063*W60, 450569*W60, -329250*W60,
|
||||
-7257875*W60, -312436*W60, 51626*W60, 555877*W60,
|
||||
-641761*W60, 1565666*W60, 884327*W60, -10960035*W60,
|
||||
-2004679*W60, -995793*W60, -2229051*W60, -146179*W60,
|
||||
-510327*W60, 1453482*W60, -3778852*W60, -2238056*W60,
|
||||
-4895983*W60, 3398883*W60, -252738*W60, 1230155*W60,
|
||||
346918*W60, 1109352*W60, 268941*W60, -2930483*W60,
|
||||
-1036263*W60, -1159280*W60, 1328176*W60, 2937642*W60,
|
||||
-9371420*W60, -6902650*W60, -1419134*W60, 1442904*W60,
|
||||
-1319056*W60, -16369*W60, 696555*W60, -279987*W60,
|
||||
-7919763*W60, 252741*W60, 459711*W60, -1709645*W60,
|
||||
354913*W60, 6025867*W60, -421460*W60, -853103*W60,
|
||||
-338649*W60, 962151*W60, 955965*W60, 784419*W60,
|
||||
-3633653*W60, 2277133*W60, -8847927*W52, 1223028*W60,
|
||||
5907079*W60, 623167*W60, 5142888*W60, 2599099*W60,
|
||||
1214280*W60, 4870359*W60, 593349*W60, -57705*W60,
|
||||
7761209*W60, -5564097*W60, 2051261*W60, 6216869*W60,
|
||||
4692163*W60, 601691*W60, -5264906*W60, 1077872*W60,
|
||||
-3205949*W60, 1833082*W60, 2081746*W60, -987363*W60,
|
||||
-1049535*W60, 2015244*W60, 874230*W60, 2168259*W60,
|
||||
-1740124*W60, -10068269*W60, -18242*W60, -3013583*W60,
|
||||
580601*W60, -2547161*W60, -535689*W60, 2220815*W60,
|
||||
1285067*W60, 2806933*W60, -983086*W60, -1729097*W60,
|
||||
-1162985*W60, -2561904*W60, 801988*W60, 244351*W60,
|
||||
1441893*W60, -7517981*W60, 271781*W60, -15021588*W60,
|
||||
-2341588*W60, -919198*W60, 1642232*W60, 4771771*W60,
|
||||
-1220099*W60, -3062372*W60, 628624*W60, 1278114*W60,
|
||||
13083513*W60, -10521925*W60, 3180310*W60, -1659307*W60,
|
||||
3543773*W60, 2501203*W60, 4151*W60, -340748*W60,
|
||||
-2285625*W60, 2495202*W60
|
||||
};
|
||||
|
||||
const double __exp_atable[355] /* __attribute__((mode(DF))) */ = {
|
||||
0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */
|
||||
0.709106182438804188967, /* 0x0.b587fb96f75097ffb */
|
||||
0.710492508843861281234, /* 0x0.b5e2d649899167ffd */
|
||||
0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */
|
||||
0.713273297897442870573, /* 0x0.b699142f945f87ffc */
|
||||
0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */
|
||||
0.716064970655995725059, /* 0x0.b75008aec758f8004 */
|
||||
0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */
|
||||
0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */
|
||||
0.720272979947266023271, /* 0x0.b863cf5d10e380003 */
|
||||
0.721681137825144314297, /* 0x0.b8c01855195c37ffb */
|
||||
0.723092048691992950199, /* 0x0.b91c8f7d213740004 */
|
||||
0.724505717938892290800, /* 0x0.b97934ec5002d0007 */
|
||||
0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */
|
||||
0.727341353138962865022, /* 0x0.ba330afcc29e98003 */
|
||||
0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */
|
||||
0.730188086709957051568, /* 0x0.baed9b40591ba0000 */
|
||||
0.731615628948127705309, /* 0x0.bb4b296f931e30002 */
|
||||
0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */
|
||||
0.734479091556371366251, /* 0x0.bc06d25dd49568001 */
|
||||
0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */
|
||||
0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */
|
||||
0.738795312814142124419, /* 0x0.bd21b08af98e78005 */
|
||||
0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */
|
||||
0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */
|
||||
0.743136898669507939299, /* 0x0.be3e38443c84e0007 */
|
||||
0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */
|
||||
0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */
|
||||
0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */
|
||||
0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */
|
||||
0.750429646104262104698, /* 0x0.c01c2843f776fffff */
|
||||
0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */
|
||||
0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */
|
||||
0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */
|
||||
0.756315338768691947122, /* 0x0.c19de1cd798578006 */
|
||||
0.757793960659406629066, /* 0x0.c1fec8f623723fffd */
|
||||
0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */
|
||||
0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */
|
||||
0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */
|
||||
0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */
|
||||
0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */
|
||||
0.766726596071518051729, /* 0x0.c44831b719bf18002 */
|
||||
0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */
|
||||
0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */
|
||||
0.771232322196981678892, /* 0x0.c56f7b41744490001 */
|
||||
0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */
|
||||
0.774250840160724651565, /* 0x0.c6354d95640dd0007 */
|
||||
0.775764526565368872643, /* 0x0.c6988106fec447fff */
|
||||
0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */
|
||||
0.778800783068235302750, /* 0x0.c75f7cf560942fffc */
|
||||
0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */
|
||||
0.781848923151573727006, /* 0x0.c8274043594cb0002 */
|
||||
0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */
|
||||
0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */
|
||||
0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */
|
||||
0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */
|
||||
0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */
|
||||
0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */
|
||||
0.792611669712891875319, /* 0x0.cae8992fd84667ffd */
|
||||
0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */
|
||||
0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */
|
||||
0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */
|
||||
0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */
|
||||
0.800389937624300440456, /* 0x0.cce65ade24d360006 */
|
||||
0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */
|
||||
0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */
|
||||
0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */
|
||||
0.806667472122675088819, /* 0x0.ce81c26b838db8000 */
|
||||
0.808244534127439906441, /* 0x0.cee91d213f8428002 */
|
||||
0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */
|
||||
0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */
|
||||
0.812994243520784198882, /* 0x0.d0206407c20e20005 */
|
||||
0.814583674571603966162, /* 0x0.d0888e4223facfff9 */
|
||||
0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */
|
||||
0.817771864936188586101, /* 0x0.d1597f377d6768002 */
|
||||
0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */
|
||||
0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */
|
||||
0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */
|
||||
0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */
|
||||
0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */
|
||||
0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */
|
||||
0.829029118181348834154, /* 0x0.d43b40960546d8001 */
|
||||
0.830649897953322891022, /* 0x0.d4a578c222a058000 */
|
||||
0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */
|
||||
0.833900969738858188772, /* 0x0.d57a88b1218e90002 */
|
||||
0.835531274148056613016, /* 0x0.d5e560a94048f8006 */
|
||||
0.837164765846411529371, /* 0x0.d6506e1aac8078003 */
|
||||
0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */
|
||||
0.840441336100884561780, /* 0x0.d72729d4c28518004 */
|
||||
0.842084427144139224814, /* 0x0.d792d8530e12b0001 */
|
||||
0.843730730487052604790, /* 0x0.d7febcb61273e7fff */
|
||||
0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */
|
||||
0.847032999194574087728, /* 0x0.d8d727962c69d7fff */
|
||||
0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */
|
||||
0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */
|
||||
0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */
|
||||
0.853676361342631029337, /* 0x0.da8a88b555baa0006 */
|
||||
0.855345327311054837175, /* 0x0.daf7e94f965f98004 */
|
||||
0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */
|
||||
0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */
|
||||
0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */
|
||||
0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */
|
||||
0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */
|
||||
0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */
|
||||
0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */
|
||||
0.868815056264353846599, /* 0x0.de6aa9dced8448001 */
|
||||
0.870513618890481399881, /* 0x0.ded9fb03db7320006 */
|
||||
0.872215502247877139094, /* 0x0.df4983e1380657ff8 */
|
||||
0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */
|
||||
0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */
|
||||
0.877341141814212965880, /* 0x0.e0996dd786fff0007 */
|
||||
0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */
|
||||
0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */
|
||||
0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */
|
||||
0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */
|
||||
0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */
|
||||
0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */
|
||||
0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */
|
||||
0.891157254447957902797, /* 0x0.e422e1bf727718006 */
|
||||
0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */
|
||||
0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */
|
||||
0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */
|
||||
0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */
|
||||
0.899902594367530173098, /* 0x0.e660043464e378005 */
|
||||
0.901661934163603406867, /* 0x0.e6d3510747e150006 */
|
||||
0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */
|
||||
0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */
|
||||
0.906960617885092856864, /* 0x0.e82e92309390b0007 */
|
||||
0.908733756358986566306, /* 0x0.e8a2c6845544afffa */
|
||||
0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */
|
||||
0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */
|
||||
0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */
|
||||
0.915861043547953501680, /* 0x0.ea75de8db8094fffe */
|
||||
0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */
|
||||
0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */
|
||||
0.921243169397334638073, /* 0x0.ebd697a43995b0007 */
|
||||
0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */
|
||||
0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */
|
||||
0.926656923710931002014, /* 0x0.ed39635df34e70006 */
|
||||
0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */
|
||||
0.930283756368834757725, /* 0x0.ee2713859aab57ffa */
|
||||
0.932102492359406786818, /* 0x0.ee9e44d9342870004 */
|
||||
0.933924784042873379360, /* 0x0.ef15b1d4635438005 */
|
||||
0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */
|
||||
0.937580062297704630580, /* 0x0.f0053f38f345cffff */
|
||||
0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */
|
||||
0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */
|
||||
0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */
|
||||
0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */
|
||||
0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */
|
||||
0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */
|
||||
0.950486566729423554277, /* 0x0.f353166f63e3dffff */
|
||||
0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */
|
||||
0.954206665969085765512, /* 0x0.f446e357f66120000 */
|
||||
0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */
|
||||
0.957941325265908139014, /* 0x0.f53ba48781046fffb */
|
||||
0.959814132734539637840, /* 0x0.f5b66106555d07ffa */
|
||||
0.961690601603558903308, /* 0x0.f6315af2c2027fffc */
|
||||
0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */
|
||||
0.965454552202857141381, /* 0x0.f728078f7c5008002 */
|
||||
0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */
|
||||
0.969233234469444204768, /* 0x0.f81fab543e1897ffb */
|
||||
0.971128118008140250896, /* 0x0.f89bda33122c78007 */
|
||||
0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */
|
||||
0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */
|
||||
0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */
|
||||
0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */
|
||||
0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */
|
||||
0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */
|
||||
0.984496437054508843888, /* 0x0.fc07f5602d79afffc */
|
||||
0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */
|
||||
0.988349647107594098099, /* 0x0.fd047b83571b1fffa */
|
||||
0.990281903873210800357, /* 0x0.fd831d66f4c018002 */
|
||||
0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */
|
||||
0.994157757657894713987, /* 0x0.fe811f703491e8006 */
|
||||
0.996101369488558541238, /* 0x0.ff007fd5744490005 */
|
||||
0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */
|
||||
1.000000000000000000000, /* 0x1.00000000000000000 */
|
||||
1.001955033605393285965, /* 0x1.0080200565d29ffff */
|
||||
1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */
|
||||
1.005876574715736104818, /* 0x1.01812090377240007 */
|
||||
1.007843096764807100351, /* 0x1.020201541aad7fff6 */
|
||||
1.009813464316352327214, /* 0x1.0283229c4c9820007 */
|
||||
1.011787683565730677817, /* 0x1.030484836910a000e */
|
||||
1.013765762469146736174, /* 0x1.0386272b9c077fffe */
|
||||
1.015747708536026694351, /* 0x1.04080ab526304fff0 */
|
||||
1.017733529475172815584, /* 0x1.048a2f412375ffff0 */
|
||||
1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */
|
||||
1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */
|
||||
1.023714316605201180057, /* 0x1.06122436442e2000e */
|
||||
1.025715712440059545995, /* 0x1.06954e0fec63afff2 */
|
||||
1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */
|
||||
1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */
|
||||
1.031743407506447551857, /* 0x1.082056011a9230009 */
|
||||
1.033760500517691527387, /* 0x1.08a487359ebd50002 */
|
||||
1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */
|
||||
1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */
|
||||
1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */
|
||||
1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */
|
||||
1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */
|
||||
1.045946142174331239262, /* 0x1.0bc3205a042060000 */
|
||||
1.047991002016745332165, /* 0x1.0c4923682a086fffe */
|
||||
1.050039859627715177527, /* 0x1.0ccf698898f3a000d */
|
||||
1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */
|
||||
1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */
|
||||
1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */
|
||||
1.058275424318780855142, /* 0x1.0eeb23619c146fffb */
|
||||
1.060344388322010722446, /* 0x1.0f72bad65714bffff */
|
||||
1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */
|
||||
1.064494458915699715017, /* 0x1.1082b577d0eef0003 */
|
||||
1.066575581342167566880, /* 0x1.110b18e893a90000a */
|
||||
1.068660772440545025953, /* 0x1.1193c09c267610006 */
|
||||
1.070750040138235936705, /* 0x1.121cacb4959befff6 */
|
||||
1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */
|
||||
1.074940837302467588937, /* 0x1.132f529d59552000b */
|
||||
1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */
|
||||
1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */
|
||||
1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */
|
||||
1.083371702785017154417, /* 0x1.1557d910df9c7000e */
|
||||
1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */
|
||||
1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */
|
||||
1.089738217537583819804, /* 0x1.16f9157586772ffff */
|
||||
1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */
|
||||
1.094003332327482702577, /* 0x1.18109a360fc23fff2 */
|
||||
1.096142145591650907149, /* 0x1.189cc58b155a70008 */
|
||||
1.098285140311341168136, /* 0x1.1929370751ea50002 */
|
||||
1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */
|
||||
1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */
|
||||
1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */
|
||||
1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */
|
||||
1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */
|
||||
1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */
|
||||
1.113403872669181282605, /* 0x1.1d0809445a97ffffc */
|
||||
1.115580614653132185460, /* 0x1.1d96b0effc9db000e */
|
||||
1.117761612217810673898, /* 0x1.1e25a001332190000 */
|
||||
1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */
|
||||
1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */
|
||||
1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */
|
||||
1.126528325196519908506, /* 0x1.2064290abc98c0001 */
|
||||
1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */
|
||||
1.130937432396844410880, /* 0x1.21851d95f776dfff0 */
|
||||
1.133148453059692917203, /* 0x1.2216045b6784efffa */
|
||||
1.135363796355857157764, /* 0x1.22a733a6692ae0004 */
|
||||
1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */
|
||||
1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */
|
||||
1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */
|
||||
1.144268564977221958089, /* 0x1.24eec8e06b035000c */
|
||||
1.146505648458203463465, /* 0x1.258164e8cea85fff8 */
|
||||
1.148747105501412235671, /* 0x1.26144a5180d380009 */
|
||||
1.150992944689175123667, /* 0x1.26a7793f5de2efffa */
|
||||
1.153243174560058870217, /* 0x1.273af1d712179000d */
|
||||
1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */
|
||||
1.157756840726344771440, /* 0x1.2862c097a3d29000c */
|
||||
1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */
|
||||
1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */
|
||||
1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */
|
||||
1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */
|
||||
1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */
|
||||
1.171404112007080167155, /* 0x1.2be123cf786790002 */
|
||||
1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */
|
||||
1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */
|
||||
1.178287955789017793514, /* 0x1.2da4478b627040002 */
|
||||
1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */
|
||||
1.182899644456603782686, /* 0x1.2ed282d76421d0004 */
|
||||
1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */
|
||||
1.187529382762033236513, /* 0x1.3001ecf60082ffffa */
|
||||
1.189851042595508889847, /* 0x1.309a13f30f28a0004 */
|
||||
1.192177241354644978669, /* 0x1.31328716a758cfff7 */
|
||||
1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */
|
||||
1.196843291137896336843, /* 0x1.32645269dfd04000a */
|
||||
1.199183159977805113226, /* 0x1.32fdaae604c39000f */
|
||||
1.201527603343041317132, /* 0x1.339750219980dfff3 */
|
||||
1.203876630171082595692, /* 0x1.3431424300e480007 */
|
||||
1.206230249419600664189, /* 0x1.34cb8170b3fee000e */
|
||||
1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */
|
||||
1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */
|
||||
1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */
|
||||
1.215690830512196507537, /* 0x1.373783a718d29000f */
|
||||
1.218067546930756250870, /* 0x1.37d3465662f480007 */
|
||||
1.220448909901335365929, /* 0x1.386f56fa770fe0008 */
|
||||
1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */
|
||||
1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */
|
||||
1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */
|
||||
1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */
|
||||
1.232425741726685064472, /* 0x1.3b8040df76f39fffa */
|
||||
1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */
|
||||
1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */
|
||||
1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */
|
||||
1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */
|
||||
1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */
|
||||
1.246953186383919165383, /* 0x1.3f3852f32973efff0 */
|
||||
1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */
|
||||
1.251833623164381181797, /* 0x1.40782b17863250005 */
|
||||
1.254280999953110153911, /* 0x1.41188f42caf400000 */
|
||||
1.256733161434815393410, /* 0x1.41b943b42945bfffd */
|
||||
1.259190116985283935980, /* 0x1.425a4893e5f10000a */
|
||||
1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */
|
||||
1.264118447754797758244, /* 0x1.439d443f608c4fff9 */
|
||||
1.266589841787181258708, /* 0x1.443f3b5bebf850008 */
|
||||
1.269066067469190262045, /* 0x1.44e183883e561fff7 */
|
||||
1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */
|
||||
1.274033051628237434048, /* 0x1.462707b2c43020009 */
|
||||
1.276523829025464573684, /* 0x1.46ca44023aa410007 */
|
||||
1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */
|
||||
1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */
|
||||
1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */
|
||||
1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */
|
||||
1.289050950070396384145, /* 0x1.49ff3e396e19d000b */
|
||||
1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */
|
||||
1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */
|
||||
1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */
|
||||
1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */
|
||||
1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */
|
||||
1.304245874766450485904, /* 0x1.4de30ec21097d0003 */
|
||||
1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */
|
||||
1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */
|
||||
1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */
|
||||
1.314475201942565174546, /* 0x1.50817263bf0e5fffb */
|
||||
1.317045045107389400535, /* 0x1.5129dd3418575000e */
|
||||
1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */
|
||||
1.322199813675649204855, /* 0x1.527bafde83a310009 */
|
||||
1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */
|
||||
1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */
|
||||
1.329969819671041886272, /* 0x1.5478e6f02775e0001 */
|
||||
1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */
|
||||
1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */
|
||||
1.337785486688218616860, /* 0x1.56791c1263abefff7 */
|
||||
1.340400902247843806217, /* 0x1.57248376aef21fffa */
|
||||
1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */
|
||||
1.345647083048053138662, /* 0x1.587c53c5a630f0002 */
|
||||
1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */
|
||||
1.350913796821875845231, /* 0x1.59d57c9110ad60006 */
|
||||
1.353554878672557082439, /* 0x1.5a8292913d68cfffc */
|
||||
1.356201123929036356254, /* 0x1.5b2fff3212db00007 */
|
||||
1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */
|
||||
1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */
|
||||
1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */
|
||||
1.366837941171020309735, /* 0x1.5de9176042f1effff */
|
||||
1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */
|
||||
1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */
|
||||
1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */
|
||||
1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */
|
||||
1.380251356531521533853, /* 0x1.6158272490016000c */
|
||||
1.382949794301995272203, /* 0x1.6208ff6a8978a000f */
|
||||
1.385653507605306700170, /* 0x1.62ba3032c0a280004 */
|
||||
1.388362506772382154503, /* 0x1.636bb9a994784000f */
|
||||
1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */
|
||||
1.393796403973427855412, /* 0x1.64cfd7545928b0002 */
|
||||
1.396521322756352656542, /* 0x1.65826be167badfff8 */
|
||||
1.399251568859207761660, /* 0x1.663559cf20826000c */
|
||||
1.401987152677323100733, /* 0x1.66e8a14a29486fffc */
|
||||
1.404728084651919228815, /* 0x1.679c427f5a4b6000b */
|
||||
1.407474375243217723560, /* 0x1.68503d9ba0add000f */
|
||||
1.410226034922914983815, /* 0x1.690492cbf6303fff9 */
|
||||
1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */
|
||||
};
|
||||
|
||||
/* All floating-point numbers can be put in one of these categories. */
|
||||
enum
|
||||
{
|
||||
FP_NAN,
|
||||
# define FP_NAN FP_NAN
|
||||
FP_INFINITE,
|
||||
# define FP_INFINITE FP_INFINITE
|
||||
FP_ZERO,
|
||||
# define FP_ZERO FP_ZERO
|
||||
FP_SUBNORMAL,
|
||||
# define FP_SUBNORMAL FP_SUBNORMAL
|
||||
FP_NORMAL
|
||||
# define FP_NORMAL FP_NORMAL
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
__fpclassifyf (float x)
|
||||
{
|
||||
uint32_t wx;
|
||||
int retval = FP_NORMAL;
|
||||
|
||||
GET_FLOAT_WORD (wx, x);
|
||||
wx &= 0x7fffffff;
|
||||
if (wx == 0)
|
||||
retval = FP_ZERO;
|
||||
else if (wx < 0x800000)
|
||||
retval = FP_SUBNORMAL;
|
||||
else if (wx >= 0x7f800000)
|
||||
retval = wx > 0x7f800000 ? FP_NAN : FP_INFINITE;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__isinff (float x)
|
||||
{
|
||||
int32_t ix,t;
|
||||
GET_FLOAT_WORD(ix,x);
|
||||
t = ix & 0x7fffffff;
|
||||
t ^= 0x7f800000;
|
||||
t |= -t;
|
||||
return ~(t >> 31) & (ix >> 30);
|
||||
}
|
||||
|
||||
/* Return nonzero value if arguments are unordered. */
|
||||
#define fpclassify(x) \
|
||||
(sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassifyf (x))
|
||||
|
||||
#ifndef isunordered
|
||||
#define isunordered(u, v) \
|
||||
(__extension__ \
|
||||
({ __typeof__(u) __u = (u); __typeof__(v) __v = (v); \
|
||||
fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; }))
|
||||
#endif
|
||||
|
||||
/* Return nonzero value if X is less than Y. */
|
||||
#ifndef isless
|
||||
#define isless(x, y) \
|
||||
(__extension__ \
|
||||
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
|
||||
!isunordered (__x, __y) && __x < __y; }))
|
||||
#endif
|
||||
|
||||
/* Return nonzero value if X is greater than Y. */
|
||||
#ifndef isgreater
|
||||
#define isgreater(x, y) \
|
||||
(__extension__ \
|
||||
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
|
||||
!isunordered (__x, __y) && __x > __y; }))
|
||||
#endif
|
||||
|
||||
float rb_exp(float x)
|
||||
{
|
||||
static const float himark = 88.72283935546875;
|
||||
static const float lomark = -103.972084045410;
|
||||
/* Check for usual case. */
|
||||
if (isless (x, himark) && isgreater (x, lomark))
|
||||
{
|
||||
static const float THREEp42 = 13194139533312.0;
|
||||
static const float THREEp22 = 12582912.0;
|
||||
/* 1/ln(2). */
|
||||
#undef M_1_LN2
|
||||
static const float M_1_LN2 = 1.44269502163f;
|
||||
/* ln(2) */
|
||||
#undef M_LN2
|
||||
static const double M_LN2 = .6931471805599452862;
|
||||
|
||||
int tval;
|
||||
double x22, t, result, dx;
|
||||
float n, delta;
|
||||
union ieee754_double ex2_u;
|
||||
#ifndef ROCKBOX
|
||||
fenv_t oldenv;
|
||||
|
||||
feholdexcept (&oldenv);
|
||||
#endif
|
||||
|
||||
#ifdef FE_TONEAREST
|
||||
fesetround (FE_TONEAREST);
|
||||
#endif
|
||||
|
||||
/* Calculate n. */
|
||||
n = x * M_1_LN2 + THREEp22;
|
||||
n -= THREEp22;
|
||||
dx = x - n*M_LN2;
|
||||
|
||||
/* Calculate t/512. */
|
||||
t = dx + THREEp42;
|
||||
t -= THREEp42;
|
||||
dx -= t;
|
||||
|
||||
/* Compute tval = t. */
|
||||
tval = (int) (t * 512.0);
|
||||
|
||||
if (t >= 0)
|
||||
delta = - __exp_deltatable[tval];
|
||||
else
|
||||
delta = __exp_deltatable[-tval];
|
||||
|
||||
/* Compute ex2 = 2^n e^(t/512+delta[t]). */
|
||||
ex2_u.d = __exp_atable[tval+177];
|
||||
ex2_u.ieee.exponent += (int) n;
|
||||
|
||||
/* Approximate e^(dx+delta) - 1, using a second-degree polynomial,
|
||||
with maximum error in [-2^-10-2^-28,2^-10+2^-28]
|
||||
less than 5e-11. */
|
||||
x22 = (0.5000000496709180453 * dx + 1.0000001192102037084) * dx + delta;
|
||||
|
||||
/* Return result. */
|
||||
#ifndef ROCKBOX
|
||||
fesetenv (&oldenv);
|
||||
#endif
|
||||
|
||||
result = x22 * ex2_u.d + ex2_u.d;
|
||||
return (float) result;
|
||||
}
|
||||
/* Exceptional cases: */
|
||||
else if (isless (x, himark))
|
||||
{
|
||||
if (__isinff (x))
|
||||
/* e^-inf == 0, with no error. */
|
||||
return 0;
|
||||
else
|
||||
/* Underflow */
|
||||
return TWOM100 * TWOM100;
|
||||
}
|
||||
else
|
||||
/* Return x, if x is a NaN or Inf; or overflow, otherwise. */
|
||||
return TWO127*x;
|
||||
long x_f = x * 65536.0f;
|
||||
return fp16_exp(x_f) / 65536.0f;
|
||||
}
|
||||
|
||||
/* Arc tangent,
|
||||
|
@ -917,6 +273,8 @@ pi_o_2 = 1.5707963705e+00, /* 0x3fc90fdb */
|
|||
pi = 3.1415927410e+00, /* 0x40490fdb */
|
||||
pi_lo = -8.7422776573e-08; /* 0xb3bbbd2e */
|
||||
|
||||
static const float zero = 0.0f;
|
||||
|
||||
float atan2_wrapper(float y, float x)
|
||||
{
|
||||
float z;
|
||||
|
|
|
@ -51,14 +51,10 @@ enddelegate
|
|||
|
||||
# Build the Windows binaries and installer, and the CHM file.
|
||||
in puzzles do make -f Makefile.doc clean
|
||||
in puzzles do make -f Makefile.doc chm
|
||||
in puzzles do make -f Makefile.doc # build help file for installer
|
||||
in puzzles do make -f Makefile.doc # build help files for installer
|
||||
in puzzles do mason.pl --args '{"version":"$(Version)","descfile":"gamedesc.txt"}' winwix.mc > puzzles.wxs
|
||||
in puzzles do perl winiss.pl $(Version) gamedesc.txt > puzzles.iss
|
||||
delegate windows
|
||||
# Ignore the poorly controlled return value from HHC, and instead
|
||||
# just test that the output file was generated.
|
||||
in puzzles with htmlhelp do/win hhc puzzles.hhp & type puzzles.chm >nul
|
||||
# FIXME: Cygwin alternative?
|
||||
in puzzles with visualstudio do/win nmake -f Makefile.vc clean
|
||||
in puzzles with visualstudio do/win nmake -f Makefile.vc VER=-DVER=$(Version)
|
||||
|
@ -67,12 +63,11 @@ delegate windows
|
|||
# provide a 'more info' URL, and an optional -n option to provide a
|
||||
# program name, and that it can take multiple .exe filename
|
||||
# arguments and sign them all in place.
|
||||
ifneq "$(winsigncode)" "" in puzzles do $(winsigncode) -i http://www.chiark.greenend.org.uk/~sgtatham/puzzles/ *.exe
|
||||
ifneq "$(winsigncode)" "" in puzzles do $(winsigncode) -i https://www.chiark.greenend.org.uk/~sgtatham/puzzles/ *.exe
|
||||
# Build installers.
|
||||
in puzzles with wix do/win candle puzzles.wxs && light -ext WixUIExtension -sval puzzles.wixobj
|
||||
in puzzles with innosetup do/win iscc puzzles.iss
|
||||
ifneq "$(winsigncode)" "" in puzzles do $(winsigncode) -i http://www.chiark.greenend.org.uk/~sgtatham/puzzles/ -n "Simon Tatham's Portable Puzzle Collection Installer" puzzles.msi Output/installer.exe
|
||||
return puzzles/puzzles.chm
|
||||
ifneq "$(winsigncode)" "" in puzzles do $(winsigncode) -i https://www.chiark.greenend.org.uk/~sgtatham/puzzles/ -n "Simon Tatham's Portable Puzzle Collection Installer" puzzles.msi Output/installer.exe
|
||||
return puzzles/*.exe
|
||||
return puzzles/Output/installer.exe
|
||||
return puzzles/puzzles.msi
|
||||
|
@ -114,9 +109,7 @@ in puzzles do chmod +x *.exe
|
|||
# return puzzles/puzzles.armv4.cab
|
||||
#enddelegate
|
||||
|
||||
# Build the help file and the HTML docs.
|
||||
in puzzles do make -f Makefile.doc clean # remove CHM-target HTML
|
||||
in puzzles do make -f Makefile.doc # and rebuild help file...
|
||||
# Build the HTML docs.
|
||||
in puzzles do mkdir doc
|
||||
in puzzles do mkdir devel
|
||||
in puzzles/doc do halibut --html -Chtml-contents-filename:index.html -Chtml-index-filename:indexpage.html -Chtml-template-filename:%k.html -Chtml-template-fragment:%k ../puzzles.but
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
all: puzzles.hlp puzzles.txt HACKING
|
||||
all: puzzles.chm puzzles.hlp puzzles.txt HACKING
|
||||
|
||||
preprocessed.but: puzzles.but
|
||||
sed 's/PREFIX-/$(BINPREFIX)/g' puzzles.but > preprocessed.but
|
||||
|
||||
puzzles.hlp puzzles.txt: preprocessed.but
|
||||
halibut --winhelp=puzzles.hlp --text=puzzles.txt preprocessed.but
|
||||
puzzles.chm: preprocessed.but
|
||||
halibut --chm=puzzles.chm preprocessed.but
|
||||
puzzles.hlp: preprocessed.but
|
||||
halibut --winhelp=puzzles.hlp preprocessed.but
|
||||
puzzles.txt: preprocessed.but
|
||||
halibut --text=puzzles.txt preprocessed.but
|
||||
|
||||
HACKING: devel.but
|
||||
halibut --text=HACKING devel.but
|
||||
|
||||
chm: puzzles.hhp
|
||||
puzzles.hhp: puzzles.but chm.but
|
||||
halibut --html puzzles.but chm.but
|
||||
|
||||
clean:
|
||||
rm -f puzzles.hlp puzzles.txt preprocessed.but HACKING *.html *.hh[pck]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
This is the README accompanying the source code to Simon Tatham's
|
||||
puzzle collection. The collection's web site is at
|
||||
<http://www.chiark.greenend.org.uk/~sgtatham/puzzles/>.
|
||||
<https://www.chiark.greenend.org.uk/~sgtatham/puzzles/>.
|
||||
|
||||
If you've obtained the source code by downloading a .tar.gz archive
|
||||
from the Puzzles web site, you should find several Makefiles in the
|
||||
|
@ -51,4 +51,4 @@ application and for the web site. It is generated from a Halibut
|
|||
source file (puzzles.but), which is the preferred form for
|
||||
modification. To generate the manual in other formats, rebuild it,
|
||||
or learn about Halibut, visit the Halibut website at
|
||||
<http://www.chiark.greenend.org.uk/~sgtatham/halibut/>.
|
||||
<https://www.chiark.greenend.org.uk/~sgtatham/halibut/>.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
|
||||
VERSION :1:1
|
||||
GAME :12:Train Tracks
|
||||
GAME :12:Tracks
|
||||
PARAMS :5:6x6dt
|
||||
CPARAMS :5:6x6dt
|
||||
SEED :15:145870397370785
|
||||
|
|
|
@ -3054,6 +3054,24 @@ static char *interpret_move(const game_state *state, game_ui *ui,
|
|||
state->lines[e_next - g->edges] != state->lines[i])
|
||||
break;
|
||||
|
||||
if (e_next == e) {
|
||||
/*
|
||||
* Special case: we might have come all the
|
||||
* way round a loop and found our way back to
|
||||
* the same edge we started from. In that
|
||||
* situation, we must terminate not only this
|
||||
* while loop, but the 'for' outside it that
|
||||
* was tracing in both directions from the
|
||||
* starting edge, because if we let it trace
|
||||
* in the second direction then we'll only
|
||||
* find ourself traversing the same loop in
|
||||
* the other order and generate an encoded
|
||||
* move string that mentions the same set of
|
||||
* edges twice.
|
||||
*/
|
||||
goto autofollow_done;
|
||||
}
|
||||
|
||||
dot = (e_next->dot1 != dot ? e_next->dot1 : e_next->dot2);
|
||||
if (movelen > movesize - 40) {
|
||||
movesize = movesize * 5 / 4 + 128;
|
||||
|
@ -3064,6 +3082,7 @@ static char *interpret_move(const game_state *state, game_ui *ui,
|
|||
(int)(e_this - g->edges), button_char);
|
||||
}
|
||||
}
|
||||
autofollow_done:;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2779,7 +2779,7 @@ static void draw_square(drawing *dr, game_drawstate *ds,
|
|||
|
||||
draw_circle(dr, COORD(x) + (xo+1)*TILESIZE/5,
|
||||
COORD(y) + (yo+1)*TILESIZE/5,
|
||||
TILESIZE/7, COL_0 + c, COL_0 + c);
|
||||
TILESIZE/4, COL_0 + c, COL_0 + c);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1701,7 +1701,7 @@ void midend_serialise(midend *me,
|
|||
*/
|
||||
if (me->ourgame->is_timed) {
|
||||
char buf[80];
|
||||
ftoa(buf, 80, me->elapsed);
|
||||
ftoa(buf, me->elapsed);
|
||||
wr("TIME", buf);
|
||||
}
|
||||
|
||||
|
|
|
@ -361,16 +361,21 @@ void draw_text_outline(drawing *dr, int x, int y, int fonttype,
|
|||
|
||||
}
|
||||
|
||||
/* kludge for non-compliant sprintf() */
|
||||
/* kludge for sprintf() in Rockbox not supporting "%-8.8s" */
|
||||
void copy_left_justified(char *buf, size_t sz, const char *str)
|
||||
{
|
||||
size_t len = strlen(str);
|
||||
assert(sz > 0);
|
||||
memset(buf, ' ', sz - 1);
|
||||
int len = strlen(str);
|
||||
if(len <= sz - 1)
|
||||
memcpy(buf, str, len);
|
||||
else
|
||||
fatal("overrun");
|
||||
assert(len <= sz - 1);
|
||||
memcpy(buf, str, len);
|
||||
buf[sz - 1] = 0;
|
||||
}
|
||||
|
||||
/* another kludge for platforms without %g support in *printf() */
|
||||
int ftoa(char *buf, float f)
|
||||
{
|
||||
return sprintf(buf, "%d.%06d", (int)f, (int)((f - (int)f)*1e6));
|
||||
}
|
||||
|
||||
/* vim: set shiftwidth=4 tabstop=8: */
|
||||
|
|
|
@ -259,7 +259,7 @@ static char *encode_params(const game_params *params, int full)
|
|||
if (full && params->barrier_probability)
|
||||
{
|
||||
len += sprintf(ret+len, "b");
|
||||
len += ftoa(ret + len, 400, params->barrier_probability);
|
||||
len += ftoa(ret + len, params->barrier_probability);
|
||||
}
|
||||
if (full && !params->unique)
|
||||
ret[len++] = 'a';
|
||||
|
@ -295,7 +295,7 @@ static config_item *game_configure(const game_params *params)
|
|||
|
||||
ret[3].name = "Barrier probability";
|
||||
ret[3].type = C_STRING;
|
||||
ftoa(buf, 80, params->barrier_probability);
|
||||
ftoa(buf, params->barrier_probability);
|
||||
ret[3].sval = dupstr(buf);
|
||||
ret[3].ival = 0;
|
||||
|
||||
|
|
|
@ -243,7 +243,7 @@ static char *encode_params(const game_params *params, int full)
|
|||
if (full && params->barrier_probability)
|
||||
{
|
||||
len += sprintf(ret+len, "b");
|
||||
len += ftoa(ret + len, 400, params->barrier_probability);
|
||||
len += ftoa(ret + len, params->barrier_probability);
|
||||
}
|
||||
/* Shuffle limit is part of the limited parameters, because we have to
|
||||
* provide the target move count. */
|
||||
|
@ -281,7 +281,7 @@ static config_item *game_configure(const game_params *params)
|
|||
|
||||
ret[3].name = "Barrier probability";
|
||||
ret[3].type = C_STRING;
|
||||
ftoa(buf, 80, params->barrier_probability);
|
||||
ftoa(buf, params->barrier_probability);
|
||||
ret[3].sval = dupstr(buf);
|
||||
ret[3].ival = 0;
|
||||
|
||||
|
|
|
@ -13,6 +13,12 @@
|
|||
\cfg{html-contents-depth-1}{2}
|
||||
\cfg{html-leaf-contains-contents}{true}
|
||||
|
||||
\cfg{chm-filename}{puzzles.chm}
|
||||
\cfg{chm-contents-filename}{index.html}
|
||||
\cfg{chm-template-filename}{%k.html}
|
||||
\cfg{chm-head-end}{<link rel="stylesheet" type="text/css" href="chm.css">}
|
||||
\cfg{chm-extra-file}{chm.css}
|
||||
|
||||
\cfg{info-filename}{puzzles.info}
|
||||
|
||||
\cfg{ps-filename}{puzzles.ps}
|
||||
|
@ -65,13 +71,13 @@ with the game binaries or the code, except pretending you wrote them
|
|||
yourself, or suing me if anything goes wrong.
|
||||
|
||||
The most recent versions, and \i{source code}, can be found at
|
||||
\I{website}\W{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/}.
|
||||
\I{website}\W{https://www.chiark.greenend.org.uk/~sgtatham/puzzles/}\cw{https://www.chiark.greenend.org.uk/~sgtatham/puzzles/}.
|
||||
|
||||
Please report \I{feedback}\i{bugs} to
|
||||
\W{mailto:anakin@pobox.com}\cw{anakin@pobox.com}.
|
||||
You might find it helpful to read this article before reporting a bug:
|
||||
|
||||
\W{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\cw{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}
|
||||
\W{https://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\cw{https://www.chiark.greenend.org.uk/~sgtatham/bugs.html}
|
||||
|
||||
\ii{Patches} are welcome. Especially if they provide a new front end
|
||||
(to make all these games run on another platform), or a new game.
|
||||
|
|
|
@ -381,6 +381,10 @@ void draw_text_outline(drawing *dr, int x, int y, int fonttype,
|
|||
* less than buffer size. */
|
||||
void copy_left_justified(char *buf, size_t sz, const char *str);
|
||||
|
||||
/* An ugly, but working float-to-string implementation for platforms
|
||||
* that don't have one */
|
||||
int ftoa(char *buf, float f);
|
||||
|
||||
/*
|
||||
* dsf.c
|
||||
*/
|
||||
|
|
|
@ -1159,7 +1159,8 @@ static int game_can_format_as_text_now(const game_params *params)
|
|||
|
||||
static char *game_text_format(const game_state *state)
|
||||
{
|
||||
int cellsize, r, c, i, w_string, h_string, n_string;
|
||||
int r, c, i, w_string, h_string, n_string;
|
||||
char cellsize;
|
||||
char *ret, *buf, *gridline;
|
||||
|
||||
int const w = state->params.w, h = state->params.h;
|
||||
|
|
|
@ -165,7 +165,7 @@ static char *encode_params(const game_params *params, int full)
|
|||
if (full && params->expandfactor)
|
||||
{
|
||||
sprintf(data + strlen(data), "e");
|
||||
ftoa(data + strlen(data), 256, params->expandfactor);
|
||||
ftoa(data + strlen(data), params->expandfactor);
|
||||
}
|
||||
if (full && !params->unique)
|
||||
strcat(data, "a");
|
||||
|
@ -194,7 +194,7 @@ static config_item *game_configure(const game_params *params)
|
|||
|
||||
ret[2].name = "Expansion factor";
|
||||
ret[2].type = C_STRING;
|
||||
ftoa(buf, 80, params->expandfactor);
|
||||
ftoa(buf, params->expandfactor);
|
||||
ret[2].sval = dupstr(buf);
|
||||
ret[2].ival = 0;
|
||||
|
||||
|
|
|
@ -2620,7 +2620,7 @@ static void game_print(drawing *dr, const game_state *state, int tilesize)
|
|||
#endif
|
||||
|
||||
const struct game thegame = {
|
||||
"Train Tracks", "games.tracks", "tracks",
|
||||
"Tracks", "games.tracks", "tracks",
|
||||
default_params,
|
||||
game_fetch_preset, NULL,
|
||||
decode_params,
|
||||
|
|
|
@ -1122,6 +1122,7 @@ static char *interpret_move(const game_state *state, game_ui *ui,
|
|||
|
||||
if (bestd <= DRAG_THRESHOLD * DRAG_THRESHOLD) {
|
||||
ui->dragpoint = best;
|
||||
ui->cursorpoint = -1;
|
||||
ui->newpoint.x = x;
|
||||
ui->newpoint.y = y;
|
||||
ui->newpoint.d = ds->tilesize;
|
||||
|
@ -1183,25 +1184,28 @@ static char *interpret_move(const game_state *state, game_ui *ui,
|
|||
bestd = 0;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
long px, py, dx, dy, d;
|
||||
float angle;
|
||||
int right_direction;
|
||||
if(i == ui->cursorpoint)
|
||||
continue;
|
||||
|
||||
long px = state->pts[i].x * ds->tilesize / state->pts[i].d;
|
||||
long py = state->pts[i].y * ds->tilesize / state->pts[i].d;
|
||||
long dx = px - state->pts[ui->cursorpoint].x * ds->tilesize / state->pts[ui->cursorpoint].d;
|
||||
long dy = py - state->pts[ui->cursorpoint].y * ds->tilesize / state->pts[ui->cursorpoint].d;
|
||||
long d = dx*dx + dy*dy;
|
||||
px = state->pts[i].x * ds->tilesize / state->pts[i].d;
|
||||
py = state->pts[i].y * ds->tilesize / state->pts[i].d;
|
||||
dx = px - state->pts[ui->cursorpoint].x * ds->tilesize / state->pts[ui->cursorpoint].d;
|
||||
dy = py - state->pts[ui->cursorpoint].y * ds->tilesize / state->pts[ui->cursorpoint].d;
|
||||
d = dx*dx + dy*dy;
|
||||
|
||||
/* Figure out if this point falls into a 90 degree
|
||||
* range extending from the current point */
|
||||
|
||||
float angle = atan2(-dy, dx); /* negate y to adjust for raster coordinates */
|
||||
angle = atan2(-dy, dx); /* negate y to adjust for raster coordinates */
|
||||
|
||||
/* offset to [0..2*PI] */
|
||||
if(angle < 0)
|
||||
angle += 2*PI;
|
||||
|
||||
int right_direction = FALSE;
|
||||
right_direction = FALSE;
|
||||
|
||||
if((button == CURSOR_UP && (1*PI/4 <= angle && angle <= 3*PI/4)) ||
|
||||
(button == CURSOR_LEFT && (3*PI/4 <= angle && angle <= 5*PI/4)) ||
|
||||
|
@ -1284,7 +1288,10 @@ static char *interpret_move(const game_state *state, game_ui *ui,
|
|||
return dupstr(buf);
|
||||
}
|
||||
else if(ui->cursorpoint < 0)
|
||||
{
|
||||
ui->cursorpoint = 0;
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
[InternetShortcut]
|
||||
URL=http://www.chiark.greenend.org.uk/~sgtatham/puzzles/
|
||||
URL=https://www.chiark.greenend.org.uk/~sgtatham/puzzles/
|
||||
|
|
|
@ -48,7 +48,7 @@ print 'VersionInfoTextVersion=Version '.$ver."\n";
|
|||
print 'AppVersion=r'.$ver."\n";
|
||||
print 'VersionInfoVersion=0.0.'.$integer_date.'.0'."\n";
|
||||
print 'AppPublisher=Simon Tatham'."\n";
|
||||
print 'AppPublisherURL=http://www.chiark.greenend.org.uk/~sgtatham/puzzles/'."\n";
|
||||
print 'AppPublisherURL=https://www.chiark.greenend.org.uk/~sgtatham/puzzles/'."\n";
|
||||
print 'DefaultDirName={pf}\Simon Tatham\'s Portable Puzzle Collection'."\n";
|
||||
print 'DefaultGroupName=Simon Tatham\'s Puzzles'."\n";
|
||||
# print 'SetupIconFile=fixmethinkoneup.ico'."\n";
|
||||
|
|
Loading…
Reference in a new issue