plugins/include/float.inc
author David Anderson <dvander@alliedmods.net>
Fri Jul 11 05:14:32 2008 +0000 (2008-07-11)
branchrefac-jit
changeset 2190 880e81f30b5e
parent 2168 c24a6fa957db
child 2289 44045ead61cd
permissions -rw-r--r--
GetContext() now returns 'this' as a hack (shouldn't+can't be accessed anyway)
dvander@2168
     1
/**
dvander@2168
     2
 * vim: set ts=4 :
dvander@2168
     3
 * =============================================================================
dvander@2168
     4
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
dvander@2168
     5
 * =============================================================================
dvander@2168
     6
 *
dvander@2168
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@2168
     8
 *
dvander@2168
     9
 * This program is free software; you can redistribute it and/or modify it under
dvander@2168
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2168
    11
 * Free Software Foundation.
dvander@2168
    12
 * 
dvander@2168
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2168
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2168
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2168
    16
 * details.
dvander@2168
    17
 *
dvander@2168
    18
 * You should have received a copy of the GNU General Public License along with
dvander@2168
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2168
    20
 *
dvander@2168
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2168
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2168
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2168
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2168
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2168
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2168
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2168
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@2168
    29
 *
dvander@2168
    30
 * Version: $Id$
dvander@2168
    31
 */
dvander@2168
    32
 
dvander@2168
    33
#if defined _float_included
dvander@2168
    34
 #endinput
dvander@2168
    35
#endif
dvander@2168
    36
#define _float_included
dvander@2168
    37
dvander@2168
    38
/**
dvander@2168
    39
 * Converts an integer into a floating point value.
dvander@2168
    40
 *
dvander@2168
    41
 * @param value			Integer to convert.
dvander@2168
    42
 * @return				Floating point value.
dvander@2168
    43
 */
dvander@2168
    44
native Float:float(value);
dvander@2168
    45
dvander@2168
    46
/**
dvander@2168
    47
 * Multiplies two floats together.
dvander@2168
    48
 *
dvander@2168
    49
 * @param oper1			First value.
dvander@2168
    50
 * @param oper2			Second value.
dvander@2168
    51
 * @return				oper1*oper2.
dvander@2168
    52
 */
dvander@2168
    53
native Float:FloatMul(Float:oper1, Float:oper2);
dvander@2168
    54
dvander@2168
    55
/**
dvander@2168
    56
 * Divides the dividend by the divisor.
dvander@2168
    57
 *
dvander@2168
    58
 * @param dividend		First value.
dvander@2168
    59
 * @param divisor		Second value.
dvander@2168
    60
 * @return				dividend/divisor.
dvander@2168
    61
 */
dvander@2168
    62
native Float:FloatDiv(Float:dividend, Float:divisor);
dvander@2168
    63
dvander@2168
    64
/**
dvander@2168
    65
 * Adds two floats together.
dvander@2168
    66
 *
dvander@2168
    67
 * @param oper1			First value.
dvander@2168
    68
 * @param oper2			Second value.
dvander@2168
    69
 * @return				oper1+oper2.
dvander@2168
    70
 */
dvander@2168
    71
native Float:FloatAdd(Float:oper1, Float:oper2);
dvander@2168
    72
dvander@2168
    73
/**
dvander@2168
    74
 * Subtracts oper2 from oper1.
dvander@2168
    75
 *
dvander@2168
    76
 * @param oper1			First value.
dvander@2168
    77
 * @param oper2			Second value.
dvander@2168
    78
 * @return				oper1-oper2.
dvander@2168
    79
 */
dvander@2168
    80
native Float:FloatSub(Float:oper1, Float:oper2);
dvander@2168
    81
dvander@2168
    82
/**
dvander@2168
    83
 * Returns the decimal part of a float.
dvander@2168
    84
 *
dvander@2168
    85
 * @param value			Input value.
dvander@2168
    86
 * @return				Decimal part.
dvander@2168
    87
 */
dvander@2168
    88
native Float:FloatFraction(Float:value);
dvander@2168
    89
dvander@2168
    90
/**
dvander@2168
    91
 * Rounds a float to the closest integer to zero.
dvander@2168
    92
 *
dvander@2168
    93
 * @param value			Input value to be rounded.
dvander@2168
    94
 * @return				Rounded value.
dvander@2168
    95
 */
dvander@2168
    96
native RoundToZero(Float:value);
dvander@2168
    97
dvander@2168
    98
/**
dvander@2168
    99
 * Rounds a float to the next highest integer value.
dvander@2168
   100
 *
dvander@2168
   101
 * @param value			Input value to be rounded.
dvander@2168
   102
 * @return				Rounded value.
dvander@2168
   103
 */
dvander@2168
   104
native RoundToCeil(Float:value);
dvander@2168
   105
dvander@2168
   106
/**
dvander@2168
   107
 * Rounds a float to the next lowest integer value.
dvander@2168
   108
 *
dvander@2168
   109
 * @param value			Input value to be rounded.
dvander@2168
   110
 * @return				Rounded value.
dvander@2168
   111
 */
dvander@2168
   112
native RoundToFloor(Float:value);
dvander@2168
   113
dvander@2168
   114
/**
dvander@2168
   115
 * Standard IEEE rounding.
dvander@2168
   116
 *
dvander@2168
   117
 * @param value			Input value to be rounded.
dvander@2168
   118
 * @return				Rounded value.
dvander@2168
   119
 */
dvander@2168
   120
native RoundToNearest(Float:value);
dvander@2168
   121
dvander@2168
   122
/**
dvander@2168
   123
 * Compares two floats.
dvander@2168
   124
 *
dvander@2168
   125
 * @param fOne			First value.
dvander@2168
   126
 * @param fTwo			Second value.
dvander@2168
   127
 * @return				Returns 1 if the first argument is greater than the second argument.
dvander@2168
   128
 *                      Returns -1 if the first argument is smaller than the second argument.
dvander@2168
   129
 *                      Returns 0 if both arguments are equal.
dvander@2168
   130
 */
dvander@2168
   131
native FloatCompare(Float:fOne, Float:fTwo);
dvander@2168
   132
dvander@2168
   133
/**
dvander@2168
   134
 * Returns the square root of the input value, equivalent to floatpower(value, 0.5).
dvander@2168
   135
 *
dvander@2168
   136
 * @param value			Input value.
dvander@2168
   137
 * @return				Square root of the value.
dvander@2168
   138
 */
dvander@2168
   139
native Float:SquareRoot(Float:value);
dvander@2168
   140
dvander@2168
   141
/**
dvander@2168
   142
 * Returns the value raised to the power of the exponent.
dvander@2168
   143
 *
dvander@2168
   144
 * @param value			Value to be raised.
dvander@2168
   145
 * @param exponent		Value to raise the base.
dvander@2168
   146
 * @return				value^exponent.
dvander@2168
   147
 */
dvander@2168
   148
native Float:Pow(Float:value, Float:exponent);
dvander@2168
   149
dvander@2168
   150
/**
dvander@2168
   151
 * Returns the value of raising the input by e.
dvander@2168
   152
 *
dvander@2168
   153
 * @param value			Input value.
dvander@2168
   154
 * @return				exp(value).
dvander@2168
   155
 */
dvander@2168
   156
native Float:Exponential(Float:value);
dvander@2168
   157
dvander@2168
   158
/**
dvander@2168
   159
 * Returns the logarithm of any base specified.
dvander@2168
   160
 *
dvander@2168
   161
 * @param value			Input value.
dvander@2168
   162
 * @param base			Logarithm base to use, default is 10.
dvander@2168
   163
 * @return				log(value)/log(base).
dvander@2168
   164
 */
dvander@2168
   165
native Float:Logarithm(Float:value, Float:base=10.0);
dvander@2168
   166
dvander@2168
   167
/**
dvander@2168
   168
 * Returns the sine of the argument.
dvander@2168
   169
 *
dvander@2168
   170
 * @param value			Input value in radians.
dvander@2168
   171
 * @return				sin(value).
dvander@2168
   172
 */
dvander@2168
   173
native Float:Sine(Float:value);
dvander@2168
   174
dvander@2168
   175
/**
dvander@2168
   176
 * Returns the cosine of the argument.
dvander@2168
   177
 *
dvander@2168
   178
 * @param value			Input value in radians.
dvander@2168
   179
 * @return				cos(value).
dvander@2168
   180
 */
dvander@2168
   181
native Float:Cosine(Float:value);
dvander@2168
   182
dvander@2168
   183
/**
dvander@2168
   184
 * Returns the tangent of the argument.
dvander@2168
   185
 *
dvander@2168
   186
 * @param value			Input value in radians.
dvander@2168
   187
 * @return				tan(value).
dvander@2168
   188
 */
dvander@2168
   189
native Float:Tangent(Float:value);
dvander@2168
   190
dvander@2168
   191
/**
dvander@2168
   192
 * Returns an absolute value.
dvander@2168
   193
 *
dvander@2168
   194
 * @param value			Input value.
dvander@2168
   195
 * @return				Absolute value of the input.
dvander@2168
   196
 */
dvander@2168
   197
native Float:FloatAbs(Float:value);
dvander@2168
   198
dvander@2168
   199
/**
dvander@2168
   200
 * Returns the arctangent of the input value.
dvander@2168
   201
 *
dvander@2168
   202
 * @param angle			Input value.
dvander@2168
   203
 * @return				atan(value) in radians.
dvander@2168
   204
 */
dvander@2168
   205
native Float:ArcTangent(Float:angle);
dvander@2168
   206
dvander@2168
   207
/**
dvander@2168
   208
 * Returns the arccosine of the input value.
dvander@2168
   209
 *
dvander@2168
   210
 * @param angle			Input value.
dvander@2168
   211
 * @return				acos(value) in radians.
dvander@2168
   212
 */
dvander@2168
   213
native Float:ArcCosine(Float:angle);
dvander@2168
   214
dvander@2168
   215
/**
dvander@2168
   216
 * Returns the arcsine of the input value.
dvander@2168
   217
 *
dvander@2168
   218
 * @param angle			Input value.
dvander@2168
   219
 * @return				asin(value) in radians.
dvander@2168
   220
 */
dvander@2168
   221
native Float:ArcSine(Float:angle);
dvander@2168
   222
dvander@2168
   223
/**
dvander@2168
   224
 * Returns the arctangent2 of the input values.
dvander@2168
   225
 *
dvander@2168
   226
 * @param x				Horizontal value.
dvander@2168
   227
 * @param y				Vertical value.
dvander@2168
   228
 * @return				atan2(value) in radians.
dvander@2168
   229
 */
dvander@2168
   230
native Float:ArcTangent2(Float:x, Float:y);
dvander@2168
   231
dvander@2168
   232
/**
dvander@2168
   233
 * Rounds a floating point number using the "round to nearest" algorithm.
dvander@2168
   234
 *
dvander@2168
   235
 * @param value			Floating point value to round.
dvander@2168
   236
 * @return				The value rounded to the nearest integer.
dvander@2168
   237
 */
dvander@2168
   238
stock RoundFloat(Float:value)
dvander@2168
   239
{
dvander@2168
   240
	return RoundToNearest(value);
dvander@2168
   241
}
dvander@2168
   242
dvander@2168
   243
/**
dvander@2168
   244
 * User defined operators.
dvander@2168
   245
 *
dvander@2168
   246
 */
dvander@2168
   247
#pragma rational Float
dvander@2168
   248
dvander@2168
   249
native Float:operator*(Float:oper1, Float:oper2) = FloatMul;
dvander@2168
   250
native Float:operator/(Float:oper1, Float:oper2) = FloatDiv;
dvander@2168
   251
native Float:operator+(Float:oper1, Float:oper2) = FloatAdd;
dvander@2168
   252
native Float:operator-(Float:oper1, Float:oper2) = FloatSub;
dvander@2168
   253
dvander@2168
   254
stock Float:operator++(Float:oper)
dvander@2168
   255
{
dvander@2168
   256
	return oper+1.0;
dvander@2168
   257
}
dvander@2168
   258
dvander@2168
   259
stock Float:operator--(Float:oper)
dvander@2168
   260
{
dvander@2168
   261
	return oper-1.0;
dvander@2168
   262
}
dvander@2168
   263
dvander@2168
   264
stock Float:operator-(Float:oper)
dvander@2168
   265
{
dvander@2168
   266
	return oper^Float:((-1)^((-1)/2));				/* IEEE values are sign/magnitude */
dvander@2168
   267
}
dvander@2168
   268
dvander@2168
   269
stock Float:operator*(Float:oper1, oper2)
dvander@2168
   270
{
dvander@2168
   271
	return FloatMul(oper1, float(oper2));			/* "*" is commutative */
dvander@2168
   272
}
dvander@2168
   273
dvander@2168
   274
stock Float:operator/(Float:oper1, oper2)
dvander@2168
   275
{
dvander@2168
   276
	return FloatDiv(oper1, float(oper2));
dvander@2168
   277
}
dvander@2168
   278
dvander@2168
   279
stock Float:operator/(oper1, Float:oper2)
dvander@2168
   280
{
dvander@2168
   281
	return FloatDiv(float(oper1), oper2);
dvander@2168
   282
}
dvander@2168
   283
dvander@2168
   284
stock Float:operator+(Float:oper1, oper2)
dvander@2168
   285
{
dvander@2168
   286
	return FloatAdd(oper1, float(oper2));			/* "+" is commutative */
dvander@2168
   287
}
dvander@2168
   288
dvander@2168
   289
stock Float:operator-(Float:oper1, oper2)
dvander@2168
   290
{
dvander@2168
   291
	return FloatSub(oper1, float(oper2));
dvander@2168
   292
}
dvander@2168
   293
dvander@2168
   294
stock Float:operator-(oper1, Float:oper2)
dvander@2168
   295
{
dvander@2168
   296
	return FloatSub(float(oper1), oper2);
dvander@2168
   297
}
dvander@2168
   298
dvander@2168
   299
stock bool:operator==(Float:oper1, Float:oper2)
dvander@2168
   300
{
dvander@2168
   301
	return FloatCompare(oper1, oper2) == 0;
dvander@2168
   302
}
dvander@2168
   303
dvander@2168
   304
stock bool:operator==(Float:oper1, oper2)
dvander@2168
   305
{
dvander@2168
   306
	return FloatCompare(oper1, float(oper2)) == 0; 	/* "==" is commutative */
dvander@2168
   307
}
dvander@2168
   308
dvander@2168
   309
stock bool:operator!=(Float:oper1, Float:oper2)
dvander@2168
   310
{
dvander@2168
   311
	return FloatCompare(oper1, oper2) != 0;
dvander@2168
   312
}
dvander@2168
   313
dvander@2168
   314
stock bool:operator!=(Float:oper1, oper2)
dvander@2168
   315
{
dvander@2168
   316
	return FloatCompare(oper1, float(oper2)) != 0; 	/* "==" is commutative */
dvander@2168
   317
}
dvander@2168
   318
dvander@2168
   319
stock bool:operator>(Float:oper1, Float:oper2)
dvander@2168
   320
{
dvander@2168
   321
	return FloatCompare(oper1, oper2) > 0;
dvander@2168
   322
}
dvander@2168
   323
dvander@2168
   324
stock bool:operator>(Float:oper1, oper2)
dvander@2168
   325
{
dvander@2168
   326
	return FloatCompare(oper1, float(oper2)) > 0;
dvander@2168
   327
}
dvander@2168
   328
dvander@2168
   329
stock bool:operator>(oper1, Float:oper2)
dvander@2168
   330
{
dvander@2168
   331
	return FloatCompare(float(oper1), oper2) > 0;
dvander@2168
   332
}
dvander@2168
   333
dvander@2168
   334
stock bool:operator>=(Float:oper1, Float:oper2)
dvander@2168
   335
{
dvander@2168
   336
	return FloatCompare(oper1, oper2) >= 0;
dvander@2168
   337
}
dvander@2168
   338
dvander@2168
   339
stock bool:operator>=(Float:oper1, oper2)
dvander@2168
   340
{
dvander@2168
   341
	return FloatCompare(oper1, float(oper2)) >= 0;
dvander@2168
   342
}
dvander@2168
   343
dvander@2168
   344
stock bool:operator>=(oper1, Float:oper2)
dvander@2168
   345
{
dvander@2168
   346
	return FloatCompare(float(oper1), oper2) >= 0;
dvander@2168
   347
}
dvander@2168
   348
dvander@2168
   349
stock bool:operator<(Float:oper1, Float:oper2)
dvander@2168
   350
{
dvander@2168
   351
	return FloatCompare(oper1, oper2) < 0;
dvander@2168
   352
}
dvander@2168
   353
dvander@2168
   354
stock bool:operator<(Float:oper1, oper2)
dvander@2168
   355
{
dvander@2168
   356
	return FloatCompare(oper1, float(oper2)) < 0;
dvander@2168
   357
}
dvander@2168
   358
dvander@2168
   359
stock bool:operator<(oper1, Float:oper2)
dvander@2168
   360
{
dvander@2168
   361
	return FloatCompare(float(oper1), oper2) < 0;
dvander@2168
   362
}
dvander@2168
   363
dvander@2168
   364
stock bool:operator<=(Float:oper1, Float:oper2)
dvander@2168
   365
{
dvander@2168
   366
	return FloatCompare(oper1, oper2) <= 0;
dvander@2168
   367
}
dvander@2168
   368
dvander@2168
   369
stock bool:operator<=(Float:oper1, oper2)
dvander@2168
   370
{
dvander@2168
   371
	return FloatCompare(oper1, float(oper2)) <= 0;
dvander@2168
   372
}
dvander@2168
   373
dvander@2168
   374
stock bool:operator<=(oper1, Float:oper2)
dvander@2168
   375
{
dvander@2168
   376
	return FloatCompare(float(oper1), oper2) <= 0;
dvander@2168
   377
}
dvander@2168
   378
dvander@2168
   379
stock bool:operator!(Float:oper)
dvander@2168
   380
{
dvander@2168
   381
	return (_:oper & ((-1)/2)) == 0;		/* -1 = all bits to 1; /2 = remove most significant bit (sign)
dvander@2168
   382
											works on both 32bit and 64bit systems; no constant required */
dvander@2168
   383
}
dvander@2168
   384
dvander@2168
   385
/**
dvander@2168
   386
 * Forbidden operators.
dvander@2168
   387
 *
dvander@2168
   388
 */
dvander@2168
   389
forward operator%(Float:oper1, Float:oper2);
dvander@2168
   390
forward operator%(Float:oper1, oper2);
dvander@2168
   391
forward operator%(oper1, Float:oper2);
dvander@2168
   392
dvander@2168
   393
#define FLOAT_PI 3.1415926535897932384626433832795
dvander@2168
   394
dvander@2168
   395
/**
dvander@2168
   396
 * Converts degrees to radians.
dvander@2168
   397
 *
dvander@2168
   398
 * @param angle		Degrees.
dvander@2168
   399
 * @return			Radians.
dvander@2168
   400
 */
dvander@2168
   401
stock Float:DegToRad(Float:angle)
dvander@2168
   402
{
dvander@2168
   403
	return (angle*FLOAT_PI)/180;
dvander@2168
   404
}
dvander@2168
   405
dvander@2168
   406
/**
dvander@2168
   407
 * Converts degrees to radians.
dvander@2168
   408
 *
dvander@2168
   409
 * @param angle		Radians.
dvander@2168
   410
 * @return			Degrees.
dvander@2168
   411
 */
dvander@2168
   412
stock Float:RadToDeg(Float:angle)
dvander@2168
   413
{
dvander@2168
   414
	return (angle*180)/FLOAT_PI;
dvander@2168
   415
}