core/smn_float.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jan 01 10:35:15 2007 +0000 (2007-01-01)
changeset 248 6ef6d19934fe
parent 242 9dcd59d9014a
child 260 110d1d014b0c
permissions -rw-r--r--
updated project file
added todo for floats
faluco@225
     1
#include <math.h>
faluco@225
     2
#include <string.h>
faluco@225
     3
#include "sp_vm_api.h"
dvander@233
     4
#include "sp_typeutil.h"
faluco@225
     5
faluco@225
     6
using namespace SourcePawn;
faluco@225
     7
dvander@248
     8
//:TODO: these need to be registered....
faluco@225
     9
faluco@225
    10
/****************************************
faluco@225
    11
*                                       *
faluco@225
    12
* FLOATING POINT NATIVE IMPLEMENTATIONS *
faluco@225
    13
*                                       *
faluco@225
    14
****************************************/
faluco@225
    15
faluco@225
    16
faluco@225
    17
static cell_t sm_float(IPluginContext *pCtx, const cell_t *params)
faluco@225
    18
{
faluco@225
    19
	float val = static_cast<float>(params[1]);
faluco@225
    20
dvander@233
    21
	return sp_ftoc(val);
faluco@225
    22
}
faluco@225
    23
faluco@225
    24
static cell_t sm_floatabs(IPluginContext *pCtx, const cell_t *params)
faluco@225
    25
{
dvander@233
    26
	float val = sp_ctof(params[1]);
faluco@225
    27
	val = (val >= 0) ? val : -val;
faluco@225
    28
dvander@233
    29
	return sp_ftoc(val);
faluco@225
    30
}
faluco@225
    31
faluco@225
    32
static cell_t sm_floatadd(IPluginContext *pCtx, const cell_t *params)
faluco@225
    33
{
dvander@233
    34
	float val = sp_ctof(params[1]) + sp_ctof(params[2]);
faluco@225
    35
dvander@233
    36
	return sp_ftoc(val);
faluco@225
    37
}
faluco@225
    38
faluco@225
    39
static cell_t sm_floatsub(IPluginContext *pCtx, const cell_t *params)
faluco@225
    40
{
dvander@233
    41
	float val = sp_ctof(params[1]) - sp_ctof(params[2]);
faluco@225
    42
dvander@233
    43
	return sp_ftoc(val);
faluco@225
    44
}
faluco@225
    45
faluco@225
    46
static cell_t sm_floatmul(IPluginContext *pCtx, const cell_t *params)
faluco@225
    47
{
dvander@233
    48
	float val = sp_ctof(params[1]) * sp_ctof(params[2]);
faluco@225
    49
dvander@233
    50
	return sp_ftoc(val);
faluco@225
    51
}
faluco@225
    52
faluco@225
    53
static cell_t sm_floatdiv(IPluginContext *pCtx, const cell_t *params)
faluco@225
    54
{
dvander@233
    55
	float val = sp_ctof(params[1]) / sp_ctof(params[2]);
faluco@225
    56
dvander@233
    57
	return sp_ftoc(val);
faluco@225
    58
}
faluco@225
    59
faluco@225
    60
static cell_t sm_floatcmp(IPluginContext *pCtx, const cell_t *params)
faluco@225
    61
{
dvander@233
    62
	float val1 = sp_ctof(params[1]);
dvander@233
    63
	float val2 = sp_ctof(params[2]);
faluco@225
    64
faluco@225
    65
	if (val1 > val2)
faluco@225
    66
	{
faluco@225
    67
		return 1;
faluco@225
    68
	} else if (val1 < val2) {
faluco@225
    69
		return -1;
faluco@225
    70
	}
faluco@225
    71
faluco@225
    72
	return 0;
faluco@225
    73
}
faluco@225
    74
faluco@225
    75
static cell_t sm_floatlog(IPluginContext *pCtx, const cell_t *params)
faluco@225
    76
{
dvander@233
    77
	float val = sp_ctof(params[1]);
dvander@233
    78
	float base = sp_ctof(params[2]);
faluco@225
    79
faluco@225
    80
	if ((val <= 0) || (base <= 0))
faluco@225
    81
	{
faluco@225
    82
		//:TODO: error out! logs cant take in negative numbers and log 0=-inf
faluco@225
    83
	}
faluco@225
    84
	if (base == 10.0)
faluco@225
    85
	{
faluco@225
    86
		val = log10(val);
faluco@225
    87
	} else {
faluco@225
    88
		val = log(val) / log(base);
faluco@225
    89
	}
faluco@225
    90
dvander@233
    91
	return sp_ftoc(val);
faluco@225
    92
}
faluco@225
    93
faluco@225
    94
static cell_t sm_floatexp(IPluginContext *pCtx, const cell_t *params)
faluco@225
    95
{
dvander@233
    96
	float val = sp_ctof(params[1]);
faluco@225
    97
dvander@233
    98
	return sp_ftoc(exp(val));
faluco@225
    99
}
faluco@225
   100
faluco@225
   101
static cell_t sm_floatpower(IPluginContext *pCtx, const cell_t *params)
faluco@225
   102
{
dvander@233
   103
	float base = sp_ctof(params[1]);
dvander@233
   104
	float exponent = sp_ctof(params[2]);
faluco@225
   105
dvander@233
   106
	return sp_ftoc(pow(base, exponent));
faluco@225
   107
}
faluco@225
   108
faluco@225
   109
static cell_t sm_floatsqroot(IPluginContext *pCtx, const cell_t *params)
faluco@225
   110
{
dvander@233
   111
	float val = sp_ctof(params[1]);
faluco@225
   112
faluco@225
   113
	if (val < 0.0)
faluco@225
   114
	{
faluco@225
   115
		//:TODO: error out! we dont support complex numbers
faluco@225
   116
	}
faluco@225
   117
dvander@233
   118
	return sp_ftoc(sqrt(val));
faluco@225
   119
}
faluco@225
   120
faluco@225
   121
static cell_t sm_floatround(IPluginContext *pCtx, const cell_t *params)
faluco@225
   122
{
dvander@233
   123
	float val = sp_ctof(params[1]);
faluco@225
   124
faluco@225
   125
	switch (params[2])
faluco@225
   126
	{
faluco@225
   127
	case 1:
faluco@225
   128
		{
faluco@225
   129
			val = floor(val);
faluco@225
   130
			break;
faluco@225
   131
		}
faluco@225
   132
	case 2:
faluco@225
   133
		{
faluco@225
   134
			val = ceil(val);
faluco@225
   135
			break;
faluco@225
   136
		}
faluco@225
   137
	case 3:
faluco@225
   138
		{
faluco@225
   139
			if (val >= 0.0)
faluco@225
   140
			{
faluco@225
   141
				val = floor(val);
faluco@225
   142
			} else {
faluco@225
   143
				val = ceil(val);
faluco@225
   144
			}
faluco@225
   145
			break;
faluco@225
   146
		}
faluco@225
   147
	default:
faluco@225
   148
		{
faluco@225
   149
			val = (float)floor(val + 0.5);
faluco@225
   150
			break;
faluco@225
   151
		}
faluco@225
   152
	}
faluco@225
   153
faluco@242
   154
	return static_cast<int>(val);
faluco@225
   155
}
faluco@225
   156
faluco@225
   157
static cell_t sm_floatstr(IPluginContext *pCtx, const cell_t *params)
faluco@225
   158
{
faluco@225
   159
	char *str;
faluco@225
   160
faluco@225
   161
	pCtx->LocalToString(params[1], &str);
faluco@225
   162
	if (!strlen(str))
faluco@225
   163
	{
faluco@225
   164
		return 0;
faluco@225
   165
	}
faluco@225
   166
dvander@233
   167
	return sp_ftoc((float)atof(str));
faluco@225
   168
}
faluco@225
   169
faluco@225
   170
static cell_t sm_floatfract(IPluginContext *pCtx, const cell_t *params)
faluco@225
   171
{
dvander@233
   172
	float val = sp_ctof(params[1]);
faluco@225
   173
	val = val - floor(val);
faluco@225
   174
dvander@233
   175
	return sp_ftoc(val);
faluco@225
   176
}
faluco@225
   177
faluco@225
   178
static cell_t sm_floatsin(IPluginContext *pCtx, const cell_t *params)
faluco@225
   179
{
dvander@233
   180
	float val = sp_ctof(params[1]);
faluco@235
   181
	val = sin(val);
faluco@225
   182
dvander@233
   183
	return sp_ftoc(val);
faluco@225
   184
}
faluco@225
   185
faluco@225
   186
static cell_t sm_floatcos(IPluginContext *pCtx, const cell_t *params)
faluco@225
   187
{
dvander@233
   188
	float val = sp_ctof(params[1]);
faluco@235
   189
	val = cos(val);
faluco@225
   190
dvander@233
   191
	return sp_ftoc(val);
faluco@225
   192
}
faluco@225
   193
faluco@225
   194
static cell_t sm_floattan(IPluginContext *pCtx, const cell_t *params)
faluco@225
   195
{
dvander@233
   196
	float val = sp_ctof(params[1]);
faluco@235
   197
	val = tan(val);
faluco@225
   198
dvander@233
   199
	return sp_ftoc(val);
faluco@225
   200
}
faluco@225
   201
faluco@225
   202
static cell_t sm_floatasin(IPluginContext *pCtx, const cell_t *params)
faluco@225
   203
{
dvander@233
   204
	float val = sp_ctof(params[1]);
faluco@225
   205
	val = asin(val);
faluco@225
   206
faluco@235
   207
	return sp_ftoc(val);
faluco@225
   208
}
faluco@225
   209
faluco@225
   210
static cell_t sm_floatacos(IPluginContext *pCtx, const cell_t *params)
faluco@225
   211
{
dvander@233
   212
	float val = sp_ctof(params[1]);
faluco@225
   213
	val = acos(val);
faluco@225
   214
faluco@235
   215
	return sp_ftoc(val);
faluco@225
   216
}
faluco@225
   217
faluco@225
   218
static cell_t sm_floatatan(IPluginContext *pCtx, const cell_t *params)
faluco@225
   219
{
dvander@233
   220
	float val = sp_ctof(params[1]);
faluco@225
   221
	val = atan(val);
faluco@225
   222
faluco@235
   223
	return sp_ftoc(val);
faluco@225
   224
}
faluco@225
   225
faluco@225
   226
static cell_t sm_floatatan2(IPluginContext *pCtx, const cell_t *params)
faluco@225
   227
{
dvander@233
   228
	float val1 = sp_ctof(params[1]);
dvander@233
   229
	float val2 = sp_ctof(params[2]);
faluco@225
   230
	val1 = atan2(val1, val2);
faluco@225
   231
faluco@235
   232
	return sp_ftoc(val1);
faluco@225
   233
}