shithub: sl

Download patch

ref: 4c0aa8a8b86164bbe9ff9c5876fbf158e8481b45
parent: 160e6ca452064fc476f9e087a7a8d007d4e928b8
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Sun Feb 2 14:18:52 EST 2025

more operator tests, remove conv_from_double (unused)

--- a/src/operators.c
+++ b/src/operators.c
@@ -45,28 +45,6 @@
 	return 0;
 }
 
-void
-conv_from_double(void *dest, double d, numerictype_t tag)
-{
-	switch(tag){
-	case T_INT8:   *(int8_t*)dest = d; break;
-	case T_UINT8:  *(uint8_t*)dest = d; break;
-	case T_INT16:  *(int16_t*)dest = d; break;
-	case T_UINT16: *(uint16_t*)dest = d; break;
-	case T_INT32:  *(int32_t*)dest = d; break;
-	case T_UINT32: *(uint32_t*)dest = d; break;
-	case T_INT64:
-		*(int64_t*)dest = d;
-		if(d > 0 && *(int64_t*)dest < 0)  // 0x8000000000000000 is a bitch
-			*(int64_t*)dest = INT64_MAX;
-		break;
-	case T_UINT64: *(uint64_t*)dest = d; break;
-	case T_MPINT:  *(mpint**)dest = dtomp(d, nil); break;
-	case T_FLOAT:  *(float*)dest = d; break;
-	case T_DOUBLE: *(double*)dest = d; break;
-	}
-}
-
 // FIXME sign with mpint
 #define CONV_TO_INTTYPE(name, ctype) \
 fl_purefn \
@@ -188,22 +166,16 @@
 		cmpmpint = mpnew(0);
 
 	if(atag == T_UINT64){
-		if(btag == T_INT64){
-			if(*(int64_t*)b >= 0)
-				return *(uint64_t*)a < (uint64_t)*(int64_t*)b;
-			return (int64_t)*(uint64_t*)a < *(int64_t*)b;
-		}
+		if(btag == T_INT64)
+			return *(int64_t*)b >= 0 && *(uint64_t*)a < (uint64_t)*(int64_t*)b;
 		if(btag == T_DOUBLE)
-			return db == db ? *(uint64_t*)a < (uint64_t)*(double*)b : 0;
+			return db >= 0 ? *(uint64_t*)a < (uint64_t)*(double*)b : 0;
 		if(btag == T_MPINT)
 			return mpcmp(uvtomp(*(uint64_t*)a, cmpmpint), *(mpint**)b) < 0;
 	}
 	if(atag == T_INT64){
-		if(btag == T_UINT64){
-			if(*(int64_t*)a >= 0)
-				return (uint64_t)*(int64_t*)a < *(uint64_t*)b;
-			return *(int64_t*)a < (int64_t)*(uint64_t*)b;
-		}
+		if(btag == T_UINT64)
+			return *(int64_t*)a >= 0 && (uint64_t)*(int64_t*)a < *(uint64_t*)b;
 		if(btag == T_DOUBLE)
 			return db == db ? *(int64_t*)a < (int64_t)*(double*)b : 0;
 		if(btag == T_MPINT)
@@ -211,7 +183,7 @@
 	}
 	if(btag == T_UINT64){
 		if(atag == T_DOUBLE)
-			return da == da ? *(uint64_t*)b > (uint64_t)*(double*)a : 0;
+			return da >= 0 ? *(uint64_t*)b > (uint64_t)*(double*)a : 0;
 		if(atag == T_MPINT)
 			return mpcmp(*(mpint**)a, uvtomp(*(uint64_t*)b, cmpmpint)) < 0;
 	}
--- a/src/operators.h
+++ b/src/operators.h
@@ -2,7 +2,6 @@
 
 mpint * conv_to_mpint(void *data, numerictype_t tag);
 double conv_to_double(void *data, numerictype_t tag);
-void conv_from_double(void *dest, double d, numerictype_t tag);
 
 int cmp_same_lt(void *a, void *b, numerictype_t tag);
 int cmp_same_eq(void *a, void *b, numerictype_t tag);
--- a/test/number-boundaries.lsp
+++ b/test/number-boundaries.lsp
@@ -89,13 +89,11 @@
   `(let ((l (low-border ,type))
          (h (high-border ,type)))
      (if (member ,type (list int64 uint64))
-       (begin (assert (= 12345 (,type (double 12345))))
-              (assert (= 12345 (,type (double 12345)))))
+       (assert (= 12345 (,type (double 12345))))
        (begin (assert (= l (,type (double l))))
               (assert (= h (,type (double h))))))
      (if (member ,type (list int32 uint32 int64 uint64))
-       (begin (assert (= 12345 (,type (float 12345))))
-              (assert (= 12345 (,type (float 12345)))))
+       (assert (= 12345 (,type (float 12345))))
        (begin
               (assert (= l (,type (float l))))
               (assert (= h (,type (float h))))))))
@@ -104,6 +102,50 @@
   `(void ,@(map (λ (type) `(float-conv- ,type)) types)))
 
 (float-conv int8 uint8 int16 uint16 int32 uint32 int64 uint64)
+
+(assert (= (low-border int32) (bignum (double (low-border int32)))))
+(assert (= (high-border int32) (bignum (double (high-border int32)))))
+(assert (= (low-border int16) (bignum (float (low-border int16)))))
+(assert (= (high-border int16) (bignum (float (high-border int16)))))
+
+(assert (= (low-border int32) (double (int64 (low-border int32)))))
+(assert (= (high-border int32) (double (int64 (high-border int32)))))
+
+(assert (= (low-border int64) (double (int64 (low-border int64)))))
+(assert (= (high-border int64) (double (int64 (high-border int64)))))
+
+(assert (= 0.5f (double (float 0.5))))
+(assert (= 0.5 (float (double 0.5f))))
+
+; comparison of different types
+
+(assert (< (uint64 (1- (high-border int64))) (int64 (high-border int64))))
+(assert (< (int64 (high-border int64)) (uint64 (1+ (high-border int64)))))
+(assert (< (int64 (high-border int64)) (uint64 (1+ (high-border int64)))))
+(assert (< (uint64 (1- (high-border int16))) (float (high-border int16))))
+(assert (< (float (high-border int16)) (uint64 (1+ (high-border int16)))))
+(assert (< (uint64 (1- (high-border int64))) (double (high-border int64))))
+(assert (> (uint64 (+ (high-border int64) 3)) (double (high-border int64))))
+(assert (< (uint64 (1- (high-border int64))) (bignum (high-border int64))))
+(assert (> (uint64 (1+ (high-border int64))) (bignum (high-border int64))))
+(assert (< (int64 (1- (high-border int64))) (bignum (high-border int64))))
+(assert (> (int64 (high-border int64)) (bignum (1- (high-border int64)))))
+
+(assert (< (uint64 0) (int64 1)))
+(assert (< (int64 0) (uint64 1)))
+(assert (> (uint64 0) (int64 -1)))
+(assert (< (int64 -1) (uint64 0)))
+(assert (< (uint64 0) (bignum 1)))
+(assert (< (int64 0) (bignum 1)))
+(assert (> (uint64 0) (bignum -1)))
+(assert (> (int64 0) (bignum -1)))
+(assert (< (int64 -1) (bignum 0)))
+(assert (> (uint64 (+ 10 (high-border int64))) (int64 (low-border int64))))
+
+(assert (= (uint64 1) (int64 1)))
+(assert (= (int64 1) (uint64 1)))
+(assert (/= (uint64 (high-border uint64)) (int64 -1)))
+(assert (/= (int64 -1) (uint64 (high-border uint64))))
 
 ; add/sub unsigned
 (assert (= 256 (+ (high-border uint8) 1)))