62 lines
1.4 KiB
C
62 lines
1.4 KiB
C
#ifndef _MATH_H
|
|
#define _MATH_H
|
|
|
|
#include <stdint.h>
|
|
|
|
int abs(int x);
|
|
double fabs(double x);
|
|
double pow(double base, double exp);
|
|
double pow10(int n);
|
|
int isinf(double x);
|
|
int isnan(double x);
|
|
|
|
static inline double floor(double x) {
|
|
int64_t i = (int64_t)x;
|
|
return (double)(i - (x < (double)i));
|
|
}
|
|
|
|
static inline double ceil(double x) {
|
|
int64_t i = (int64_t)x;
|
|
return (double)(i + (x > (double)i));
|
|
}
|
|
|
|
static inline double round(double x) {
|
|
return (x >= 0.0) ? floor(x + 0.5) : ceil(x - 0.5);
|
|
}
|
|
|
|
static inline double sqrt(double x) {
|
|
double result;
|
|
asm volatile ("sqrtsd %1, %0" : "=x"(result) : "x"(x));
|
|
return result;
|
|
}
|
|
|
|
static inline float sqrtf(float x) {
|
|
float result;
|
|
asm volatile ("sqrtss %1, %0" : "=x"(result) : "x"(x));
|
|
return result;
|
|
}
|
|
|
|
static inline double log2(double x) {
|
|
double result;
|
|
asm volatile (
|
|
"fld1\n\t"
|
|
"fld %1\n\t"
|
|
"fyl2x\n\t"
|
|
"fstp %0\n\t"
|
|
: "=m"(result) : "m"(x)
|
|
);
|
|
return result;
|
|
}
|
|
|
|
#define MIN(a, b) ({ __typeof__(a) _a = (a); __typeof__(b) _b = (b); _a < _b ? _a : _b; })
|
|
#define MAX(a, b) ({ __typeof__(a) _a = (a); __typeof__(b) _b = (b); _a > _b ? _a : _b; })
|
|
|
|
#define ALIGN_UP(x, align) (((x) + (align) - 1) & ~((align) - 1))
|
|
#define ALIGN_DOWN(x, align) ((x) & ~((align) - 1))
|
|
|
|
#define IS_POWER_OF_TWO(x) ((x) != 0 && (((x) & ((x) - 1)) == 0))
|
|
|
|
#define INFINITY (1.0/0.0)
|
|
#define NAN (0.0/0.0)
|
|
|
|
#endif |