fix scroller inf divide, safe ratio, safe cast
This commit is contained in:
@@ -18,6 +18,30 @@ typedef int8_t b8;
|
||||
typedef float f32;
|
||||
typedef double f64;
|
||||
|
||||
#define f32_max FLT_MAX
|
||||
#define f32_min FLT_MIN
|
||||
#define f64_max DBL_MAX
|
||||
#define f64_min DBL_MIN
|
||||
|
||||
#define i8_max INT8_MAX
|
||||
#define i8_min INT8_MIN
|
||||
#define i16_max INT16_MAX
|
||||
#define i16_min INT16_MIN
|
||||
#define i32_max INT32_MAX
|
||||
#define i32_min INT32_MIN
|
||||
#define i64_max INT64_MAX
|
||||
#define i64_min INT64_MIN
|
||||
|
||||
#define u8_max UINT8_MAX
|
||||
#define u8_min 0
|
||||
#define u16_max UINT16_MAX
|
||||
#define u16_min 0
|
||||
#define u32_max UINT32_MAX
|
||||
#define u32_min 0
|
||||
#define u64_max UINT64_MAX
|
||||
#define u64_min 0
|
||||
|
||||
|
||||
#ifndef true
|
||||
#define true 1
|
||||
#endif
|
||||
|
||||
@@ -181,7 +181,7 @@ fn f32 f32_pow(f32 x, f32 y) {
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
**/
|
||||
f32 f32_round(f32 x) {
|
||||
fn f32 f32_round(f32 x) {
|
||||
u32 w = F32_TO_U32(x);
|
||||
/* Most significant word, least significant word. */
|
||||
int exponent_less_127;
|
||||
@@ -214,3 +214,25 @@ f32 f32_round(f32 x) {
|
||||
x = U32_TO_F32(w);
|
||||
return x;
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
// other
|
||||
fn u32 u32_cast(u64 v) {
|
||||
assert(v <= u32_max);
|
||||
return (u32)v;
|
||||
}
|
||||
|
||||
fn u16 u16_cast(u64 v) {
|
||||
assert(v <= u16_max);
|
||||
return (u16)v;
|
||||
}
|
||||
|
||||
fn u8 u8_cast(u64 v) {
|
||||
assert(v <= u8_max);
|
||||
return (u8)v;
|
||||
}
|
||||
|
||||
fn i32 i32_cast(i64 v) {
|
||||
assert(v >= i32_min && v <= i32_max);
|
||||
return (i32)v;
|
||||
}
|
||||
|
||||
@@ -875,3 +875,23 @@ fn_inline r2i64_t r2i64_add_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i6
|
||||
fn_inline r2i64_t r2i64_sub_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_sub(a.min, b), v2i64_sub(a.max, b) }; }
|
||||
fn_inline r2i64_t r2i64_mul_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_mul(a.min, b), v2i64_mul(a.max, b) }; }
|
||||
fn_inline r2i64_t r2i64_div_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_div(a.min, b), v2i64_div(a.max, b) }; }
|
||||
fn f32 f32_safe_ratio(f32 a, f32 b, f32 if0) {
|
||||
f32 result = if0;
|
||||
if (b != 0.0) {
|
||||
result = a / b;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
fn_inline f32 f32_safe_ratio0(f32 a, f32 b) { return f32_safe_ratio(a, b, 0); }
|
||||
fn_inline f32 f32_safe_ratio1(f32 a, f32 b) { return f32_safe_ratio(a, b, 0); }
|
||||
fn f64 f64_safe_ratio(f64 a, f64 b, f64 if0) {
|
||||
f64 result = if0;
|
||||
if (b != 0.0) {
|
||||
result = a / b;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
fn_inline f64 f64_safe_ratio0(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); }
|
||||
fn_inline f64 f64_safe_ratio1(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); }
|
||||
|
||||
@@ -374,3 +374,18 @@ fn_inline r2f64_t r2f64_sub_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f6
|
||||
print(s)
|
||||
|
||||
|
||||
for bt in ["f32", "f64"]:
|
||||
s = """
|
||||
fn f64 f64_safe_ratio(f64 a, f64 b, f64 if0) {
|
||||
f64 result = if0;
|
||||
if (b != 0.0) {
|
||||
result = a / b;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
fn_inline f64 f64_safe_ratio0(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); }
|
||||
fn_inline f64 f64_safe_ratio1(f64 a, f64 b) { return f64_safe_ratio(a, b, 0); }
|
||||
""".strip()
|
||||
s = s.replace("f64", bt)
|
||||
print(s)
|
||||
Reference in New Issue
Block a user