kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

152_fp_cmp_builtins_a.toy (2153B)


      1 // Route A: C99-style floating comparison builtins.
      2 //   @isless/@islessequal/@isgreater/@isgreaterequal -> ordered OLT/OLE/OGT/OGE
      3 //   @islessgreater -> ordered-and-not-equal (ONE), reachable only here
      4 //   @isunordered   -> synthesized isnan(a) || isnan(b)
      5 // Each test fn returns 0 on success; __user_main sums them, so a nonzero exit
      6 // pinpoints the first failing predicate. NaN is built from a runtime 0.0/0.0.
      7 fn nan_via(x: f64): f64 { let z: f64 = x - x; return z / z; }
      8 
      9 fn test_isless(): i64 {
     10   if @isless(1.0, 2.0) { } else { return 1; }   // 1 < 2 -> true
     11   if @isless(2.0, 1.0) { return 2; }             // false
     12   let n: f64 = nan_via(3.0);
     13   if @isless(n, 1.0) { return 3; }               // NaN ordered -> false
     14   return 0;
     15 }
     16 
     17 fn test_islessequal(): i64 {
     18   if @islessequal(1.0, 1.0) { } else { return 1; }
     19   if @islessequal(2.0, 1.0) { return 2; }
     20   let n: f64 = nan_via(3.0);
     21   if @islessequal(n, n) { return 3; }
     22   return 0;
     23 }
     24 
     25 fn test_isgreater(): i64 {
     26   if @isgreater(2.0, 1.0) { } else { return 1; }
     27   if @isgreater(1.0, 2.0) { return 2; }
     28   let n: f64 = nan_via(3.0);
     29   if @isgreater(n, 1.0) { return 3; }
     30   return 0;
     31 }
     32 
     33 fn test_isgreaterequal(): i64 {
     34   if @isgreaterequal(2.0, 2.0) { } else { return 1; }
     35   if @isgreaterequal(1.0, 2.0) { return 2; }
     36   let n: f64 = nan_via(3.0);
     37   if @isgreaterequal(n, 1.0) { return 3; }
     38   return 0;
     39 }
     40 
     41 fn test_islessgreater(): i64 {
     42   if @islessgreater(1.0, 2.0) { } else { return 1; }  // ordered & not equal -> true
     43   if @islessgreater(2.0, 2.0) { return 2; }           // equal -> false
     44   let n: f64 = nan_via(3.0);
     45   if @islessgreater(n, 1.0) { return 3; }             // NaN ordered -> false
     46   return 0;
     47 }
     48 
     49 fn test_isunordered(): i64 {
     50   let n: f64 = nan_via(3.0);
     51   if @isunordered(n, 1.0) { } else { return 1; }  // NaN -> true
     52   if @isunordered(1.0, n) { } else { return 2; }
     53   if @isunordered(1.0, 2.0) { return 3; }         // both ordered -> false
     54   return 0;
     55 }
     56 
     57 fn __user_main(): i64 {
     58   return test_isless() + test_islessequal() + test_isgreater() +
     59          test_isgreaterequal() + test_islessgreater() + test_isunordered();
     60 }
     61 
     62 fn main(): i32 { return __user_main() as i32; }