mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 19:43:32 +00:00
00611e9b06
The ZIP filesystem has a breaking change. You now need to use /zip/ to open() / opendir() / etc. assets within the ZIP structure of your APE binary, instead of the previous convention of using zip: or zip! URIs. This is needed because Python likes to use absolute paths, and having ZIP paths encoded like URIs simply broke too many things. Many more system calls have been updated to be able to operate on ZIP files and file descriptors. In particular fcntl() and ioctl() since Python would do things like ask if a ZIP file is a terminal and get confused when the old implementation mistakenly said yes, because the fastest way to guarantee native file descriptors is to dup(2). This change also improves the async signal safety of zipos and ensures it doesn't maintain any open file descriptors beyond that which the user has opened. This change makes a lot of progress towards adding magic numbers that are specific to platforms other than Linux. The philosophy here is that, if you use an operating system like FreeBSD, then you should be able to take advantage of FreeBSD exclusive features, even if we don't polyfill them on other platforms. For example, you can now open() a file with the O_VERIFY flag. If your program runs on other platforms, then Cosmo will automatically set O_VERIFY to zero. This lets you safely use it without the need for #ifdef or ifstatements which detract from readability. One of the blindspots of the ASAN memory hardening we use to offer Rust like assurances has always been that memory passed to the kernel via system calls (e.g. writev) can't be checked automatically since the kernel wasn't built with MODE=asan. This change makes more progress ensuring that each system call will verify the soundness of memory before it's passed to the kernel. The code for doing these checks is fast, particularly for buffers, where it can verify 64 bytes a cycle. - Correct O_LOOP definition on NT - Introduce program_executable_name - Add ASAN guards to more system calls - Improve termios compatibility with BSDs - Fix bug in Windows auxiliary value encoding - Add BSD and XNU specific errnos and open flags - Add check to ensure build doesn't talk to internet
302 lines
9.8 KiB
C
302 lines
9.8 KiB
C
#ifndef COSMOPOLITAN_LIBC_MATH_H_
|
||
#define COSMOPOLITAN_LIBC_MATH_H_
|
||
/*─────────────────────────────────────────────────────────────────────────────╗
|
||
│ cosmopolitan § mathematics │
|
||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||
|
||
#define M_E 2.7182818284590452354 /* 𝑒 */
|
||
#define M_LOG2_10 0xd.49a784bcd1b8afep-2 /* log₂10 ≈ 3.3219280948873623478 */
|
||
#define M_LOG10_2 0x9.a209a84fbcff799p-5 /* log₁₀2 ≈ 0.301029995663981195 */
|
||
#define M_LOG2E 0xb.8aa3b295c17f0bcp-3 /* log₂𝑒 ≈ 1.4426950408889634074 */
|
||
#define M_LOG10E 0.43429448190325182765 /* log₁₀𝑒 */
|
||
#define M_LN2 0xb.17217f7d1cf79acp-4 /* logₑ2 ≈ */
|
||
#define M_LN10 2.30258509299404568402 /* logₑ10 */
|
||
#define M_TAU 0x1.921fb54442d1846ap+2 /* τ = 2π */
|
||
#define M_PI 0x1.921fb54442d1846ap+1 /* π ≈ 3.14159265358979323846 */
|
||
#define M_PI_2 1.57079632679489661923 /* π/2 */
|
||
#define M_PI_4 0.78539816339744830962 /* π/4 */
|
||
#define M_1_PI 0.31830988618379067154 /* 1/π */
|
||
#define M_2_PI 0.63661977236758134308 /* 2/π */
|
||
#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrtπ */
|
||
#define M_SQRT2 1.41421356237309504880 /* sqrt2 */
|
||
#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt2 */
|
||
|
||
#define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
|
||
#define DBL_DIG __DBL_DIG__
|
||
#define DBL_EPSILON __DBL_EPSILON__
|
||
#define DBL_MANT_DIG __DBL_MANT_DIG__
|
||
#define DBL_MANT_DIG __DBL_MANT_DIG__
|
||
#define DBL_MAX __DBL_MAX__
|
||
#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
|
||
#define DBL_MAX_EXP __DBL_MAX_EXP__
|
||
#define DBL_MIN __DBL_MIN__ /* 2.23e–308 ↔ 1.79e308 */
|
||
#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
|
||
#define DBL_MIN_EXP __DBL_MIN_EXP__
|
||
#define DECIMAL_DIG __LDBL_DECIMAL_DIG__
|
||
#define FLT_DECIMAL_DIG __FLT_DECIMAL_DIG__
|
||
#define FLT_RADIX __FLT_RADIX__
|
||
#define FLT_DIG __FLT_DIG__
|
||
#define FLT_EPSILON __FLT_EPSILON__
|
||
#define FLT_MANT_DIG __FLT_MANT_DIG__
|
||
#define FLT_MANT_DIG __FLT_MANT_DIG__
|
||
#define FLT_MAX __FLT_MAX__
|
||
#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
|
||
#define FLT_MAX_EXP __FLT_MAX_EXP__
|
||
#define FLT_MIN __FLT_MIN__ /* 1.18e–38 ↔ 3.40e38 */
|
||
#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
|
||
#define FLT_MIN_EXP __FLT_MIN_EXP__
|
||
#define HLF_MAX 6.50e4f
|
||
#define HLF_MIN 3.10e-5f
|
||
#define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__
|
||
#define LDBL_DIG __LDBL_DIG__
|
||
#define LDBL_EPSILON __LDBL_EPSILON__
|
||
#define LDBL_MANT_DIG __LDBL_MANT_DIG__
|
||
#define LDBL_MANT_DIG __LDBL_MANT_DIG__
|
||
#define LDBL_MAX __LDBL_MAX__
|
||
#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
|
||
#define LDBL_MAX_EXP __LDBL_MAX_EXP__
|
||
#define LDBL_MIN __LDBL_MIN__ /* 3.37e–4932 ↔ 1.18e4932 */
|
||
#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
|
||
#define LDBL_MIN_EXP __LDBL_MIN_EXP__
|
||
|
||
#define FP_NAN 0
|
||
#define FP_INFINITE 1
|
||
#define FP_ZERO 2
|
||
#define FP_SUBNORMAL 3
|
||
#define FP_NORMAL 4
|
||
|
||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||
COSMOPOLITAN_C_START_
|
||
|
||
#define NAN __builtin_nanf("")
|
||
#define INFINITY __builtin_inff()
|
||
#define HUGE_VAL __builtin_inf()
|
||
#define HUGE_VALF __builtin_inff()
|
||
#define HUGE_VALL __builtin_infl()
|
||
|
||
#if __FLT_EVAL_METHOD__ + 0 == 2
|
||
typedef long double float_t;
|
||
typedef long double double_t;
|
||
#else
|
||
typedef float float_t;
|
||
typedef double double_t;
|
||
#endif
|
||
|
||
#define isinf(x) __builtin_isinf(x)
|
||
#define isnan(x) __builtin_isnan(x)
|
||
#define isfinite(x) __builtin_isfinite(x)
|
||
#define isnormal(x) __builtin_isnormal(x)
|
||
#define signbit(x) __builtin_signbit(x)
|
||
#define isgreater(x, y) __builtin_isgreater(x, y)
|
||
#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
|
||
#define isless(x, y) __builtin_isless(x, y)
|
||
#define islessequal(x, y) __builtin_islessequal(x, y)
|
||
#define islessgreater(x, y) __builtin_islessgreater(x, y)
|
||
#define isunordered(x, y) __builtin_isunordered(x, y)
|
||
|
||
#define fpclassify(x) \
|
||
__builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x)
|
||
|
||
double acos(double);
|
||
double acosh(double);
|
||
double asin(double);
|
||
double asinh(double);
|
||
double atan(double);
|
||
double atan2(double, double);
|
||
double atanh(double);
|
||
double cbrt(double);
|
||
double ceil(double);
|
||
double copysign(double, double);
|
||
double cos(double);
|
||
double cosh(double);
|
||
double drem(double, double);
|
||
double erf(double);
|
||
double erfc(double);
|
||
double exp(double);
|
||
double exp10(double);
|
||
double exp2(double);
|
||
double expm1(double);
|
||
double fabs(double);
|
||
double fdim(double, double);
|
||
double floor(double);
|
||
double fma(double, double, double);
|
||
double fmax(double, double);
|
||
double fmin(double, double);
|
||
double fmod(double, double);
|
||
double hypot(double, double);
|
||
double ldexp(double, int);
|
||
double log(double);
|
||
double log10(double);
|
||
double log1p(double);
|
||
double log2(double);
|
||
double logb(double);
|
||
double nearbyint(double);
|
||
double nextafter(double, double);
|
||
double nexttoward(double, long double);
|
||
double pow(double, double);
|
||
double pow10(double);
|
||
double powi(double, int);
|
||
double remainder(double, double);
|
||
double rint(double);
|
||
double round(double);
|
||
double scalb(double, double);
|
||
double scalbln(double, long int);
|
||
double scalbn(double, int);
|
||
double significand(double);
|
||
double sin(double);
|
||
double sinh(double);
|
||
double sqrt(double);
|
||
double tan(double);
|
||
double tanh(double);
|
||
double trunc(double);
|
||
double tgamma(double);
|
||
double lgamma(double);
|
||
double lgamma_r(double, int *);
|
||
int finite(double);
|
||
|
||
float acosf(float);
|
||
float acoshf(float);
|
||
float asinf(float);
|
||
float asinhf(float);
|
||
float atan2f(float, float);
|
||
float atanf(float);
|
||
float atanhf(float);
|
||
float cbrtf(float);
|
||
float ceilf(float);
|
||
float copysignf(float, float);
|
||
float cosf(float);
|
||
float coshf(float);
|
||
float dremf(float, float);
|
||
float erfcf(float);
|
||
float erff(float);
|
||
float exp10f(float);
|
||
float exp2f(float);
|
||
float expf(float);
|
||
float expm1f(float);
|
||
float fabsf(float);
|
||
float fdimf(float, float);
|
||
float floorf(float);
|
||
float fmaf(float, float, float);
|
||
float fmaxf(float, float);
|
||
float fminf(float, float);
|
||
float fmodf(float, float);
|
||
float hypotf(float, float);
|
||
float ldexpf(float, int);
|
||
float log10f(float);
|
||
float log1pf(float);
|
||
float log2f(float);
|
||
float logbf(float);
|
||
float logf(float);
|
||
float nearbyintf(float);
|
||
float nextafterf(float, float);
|
||
float nexttowardf(float, long double);
|
||
float pow10f(float);
|
||
float powf(float, float);
|
||
float powif(float, int);
|
||
float remainderf(float, float);
|
||
float rintf(float);
|
||
float roundf(float);
|
||
float scalbf(float, float);
|
||
float scalblnf(float, long int);
|
||
float scalbnf(float, int);
|
||
float significandf(float);
|
||
float sinf(float);
|
||
float sinhf(float);
|
||
float sqrtf(float);
|
||
float tanf(float);
|
||
float tanhf(float);
|
||
float truncf(float);
|
||
float tgammaf(float);
|
||
int finitef(float);
|
||
|
||
long double acoshl(long double);
|
||
long double acosl(long double);
|
||
long double asinhl(long double);
|
||
long double asinl(long double);
|
||
long double atan2l(long double, long double);
|
||
long double atanhl(long double);
|
||
long double atanl(long double);
|
||
long double cbrtl(long double);
|
||
long double ceill(long double);
|
||
long double copysignl(long double, long double);
|
||
long double coshl(long double);
|
||
long double cosl(long double);
|
||
long double dreml(long double, long double);
|
||
long double erfcl(long double);
|
||
long double erfl(long double);
|
||
long double exp10l(long double);
|
||
long double exp2l(long double);
|
||
long double expl(long double);
|
||
long double expm1l(long double);
|
||
long double fabsl(long double);
|
||
long double fdiml(long double, long double);
|
||
long double floorl(long double);
|
||
long double fmal(long double, long double, long double);
|
||
long double fmaxl(long double, long double);
|
||
long double fminl(long double, long double);
|
||
long double fmodl(long double, long double);
|
||
long double hypotl(long double, long double);
|
||
long double ldexpl(long double, int);
|
||
long double log10l(long double);
|
||
long double log1pl(long double);
|
||
long double log2l(long double);
|
||
long double logbl(long double);
|
||
long double logl(long double);
|
||
long double nearbyintl(long double);
|
||
long double nextafterl(long double, long double);
|
||
long double nexttowardl(long double, long double);
|
||
long double pow10l(long double);
|
||
long double powil(long double, int);
|
||
long double powl(long double, long double);
|
||
long double remainderl(long double, long double);
|
||
long double rintl(long double);
|
||
long double roundl(long double);
|
||
long double scalbl(long double, long double);
|
||
long double scalblnl(long double, long int);
|
||
long double scalbnl(long double, int);
|
||
long double significandl(long double);
|
||
long double sinhl(long double);
|
||
long double sinl(long double);
|
||
long double sqrtl(long double);
|
||
long double tanhl(long double);
|
||
long double tanl(long double);
|
||
long double truncl(long double);
|
||
int finitel(long double);
|
||
|
||
long lrint(double);
|
||
long lrintf(float);
|
||
long lrintl(long double);
|
||
long lround(double);
|
||
long lroundf(float);
|
||
long lroundl(long double);
|
||
|
||
int ilogbf(float);
|
||
int ilogb(double);
|
||
int ilogbl(long double);
|
||
|
||
long long llrint(double);
|
||
long long llrintf(float);
|
||
long long llrintl(long double);
|
||
long long llround(double);
|
||
long long llroundf(float);
|
||
long long llroundl(long double);
|
||
|
||
double frexp(double, int *);
|
||
double modf(double, double *);
|
||
double remquo(double, double, int *);
|
||
float frexpf(float, int *);
|
||
float modff(float, float *);
|
||
float remquof(float, float, int *);
|
||
long double frexpl(long double, int *);
|
||
long double modfl(long double, long double *);
|
||
long double remquol(long double, long double, int *);
|
||
void sincos(double, double *, double *);
|
||
void sincosf(float, float *, float *);
|
||
void sincosl(long double, long double *, long double *);
|
||
|
||
float fsumf(const float *, size_t);
|
||
double fsum(const double *, size_t);
|
||
|
||
COSMOPOLITAN_C_END_
|
||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||
#endif /* COSMOPOLITAN_LIBC_MATH_H_ */
|