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; }