mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-20 09:04:43 +00:00
123 lines
2.9 KiB
C
123 lines
2.9 KiB
C
|
#ifndef INCLUDE_LIBQB_ROUNDING_H
|
||
|
#define INCLUDE_LIBQB_ROUNDING_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#include "event.h"
|
||
|
|
||
|
int64_t qbr(long double);
|
||
|
uint64_t qbr_longdouble_to_uint64(long double);
|
||
|
int32_t qbr_float_to_long(float);
|
||
|
int32_t qbr_double_to_long(double);
|
||
|
|
||
|
void fpu_reinit();
|
||
|
|
||
|
// CSNG
|
||
|
static inline double func_csng_float(long double value) {
|
||
|
if ((value <= 3.402823466E38) && (value >= -3.402823466E38)) {
|
||
|
return value;
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline double func_csng_double(double value) {
|
||
|
if ((value <= 3.402823466E38) && (value >= -3.402823466E38)) {
|
||
|
return value;
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// CDBL
|
||
|
static inline double func_cdbl_float(long double value) {
|
||
|
if ((value <= 1.7976931348623157E308) &&
|
||
|
(value >= -1.7976931348623157E308)) {
|
||
|
return value;
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// CINT
|
||
|
// func_cint_single uses func_cint_double
|
||
|
static inline int32_t func_cint_double(double value) {
|
||
|
if ((value < 32767.5) && (value >= -32768.5)) {
|
||
|
return qbr_double_to_long(value);
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int64_t func_cint_float(long double value) {
|
||
|
if ((value < 32767.5) && (value >= -32768.5)) {
|
||
|
return qbr(value);
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int16_t func_cint_long(int32_t value) {
|
||
|
if ((value >= -32768) && (value <= 32767))
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int16_t func_cint_ulong(uint32_t value) {
|
||
|
if (value <= 32767)
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int16_t func_cint_int64(int64_t value) {
|
||
|
if ((value >= -32768) && (value <= 32767))
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int16_t func_cint_uint64(uint64_t value) {
|
||
|
if (value <= 32767)
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// CLNG
|
||
|
// func_clng_single uses func_clng_double
|
||
|
//-2147483648 to 2147483647
|
||
|
static inline int32_t func_clng_double(double value) {
|
||
|
if ((value < 2147483647.5) && (value >= -2147483648.5)) {
|
||
|
return qbr_double_to_long(value);
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int64_t func_clng_float(long double value) {
|
||
|
if ((value < 2147483647.5) && (value >= -2147483648.5)) {
|
||
|
return qbr(value);
|
||
|
}
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int32_t func_clng_ulong(uint32_t value) {
|
||
|
if (value <= 2147483647)
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int32_t func_clng_int64(int64_t value) {
|
||
|
if ((value >= -2147483648) && (value <= 2147483647))
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int32_t func_clng_uint64(uint64_t value) {
|
||
|
if (value <= 2147483647)
|
||
|
return value;
|
||
|
error(6);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//_ROUND (note: round performs no error checking)
|
||
|
static inline int64_t func_round_double(long double value) { return qbr(value); }
|
||
|
static inline int64_t func_round_float(long double value) { return qbr(value); }
|
||
|
|
||
|
#endif
|