tmath1.cef


この外部関数では、すべてのセミ数値演算関数がテストされる。テストによっては、正確な値の生成が期待される。それ以外のテストでは、小さなエラーが生じるかもしれない。後者のテストについては、approx関数を使って結果の精度劣化が2ビット以下かどうかをチェックする。すべてのテストにパスすると、次のメッセージが出力される。

SUCCESS testing function, part 1

インタープリタには、このテストにパスすることが要求される。


#すべてのセミ数値演算関数のテスト

:define DBL_EPSILON 2.2204460492503131e\-016
func approx
        return (@1 ? (abs ((@1 - @0) / @1)) (abs @0)) < (DBL_EPSILON * 4.0)
endfunc

:ans 0
:assert 1
:gfloat 16

assert ceil \-5.1 == \-5.0
assert ceil \-5.0 == \-5.0
assert ceil \-4.9 == \-4.0
assert ceil 0.0 == 0.0
assert ceil 4.9 == 5.0
assert ceil 5.0 == 5.0
assert ceil 5.1 == 6.0

assert abs \-5.0 == 5.0
assert abs 0.0 == 0.0
assert abs 5.0 == 5.0

assert floor \-5.1 == \-6.0
assert floor \-5.0 == \-5.0
assert floor \-4.9 == \-5.0
assert floor 0.0 == 0.0
assert floor 4.9 == 4.0
assert floor 5.0 == 5.0
assert floor 5.1 == 5.0

assert (\-7.0 % 3.0) == \-1.0
assert (\-3.0 % 3.0) == 0.0
assert (\-2.0 % 3.0) == \-2.0
assert (0.0 % 3.0) == 0.0
assert (2.0 % 3.0) == 2.0
assert (3.0 % 3.0) == 0.0
assert (7.0 % 3.0) == 1.0

assert approx (frexp \-3.0 @x) \-0.75 && @x == 2
assert approx (frexp \-0.5 @x) \-0.5 && @x == 0
assert frexp 0.0 @x == 0.0 && @x == 0
assert approx (frexp 0.33 @x) 0.66 && @x == \-1
assert approx (frexp 0.66 @x) 0.66 && @x == 0
assert approx (frexp 96.0 @x) 0.75 && @x == 7

assert ldexp \-3.0 4 == \-48.0
assert ldexp \-0.5 0 == \-0.5
assert ldexp 0.0 36 == 0.0
assert approx (ldexp 0.66 \-1) 0.33
assert ldexp 96 \-3 == 12.0

assert approx (modf \-11.7 @x) (\-11.7 + 11.0) && @x == \-11.0
assert modf \-0.5 @x == \-0.5 && @x == 0.0
assert modf 0.0 @x == 0.0 && @x == 0.0
assert modf 0.6 @x == 0.6 && @x == 0.0
assert modf 12.0 @x == 0.0 && @x == 12.0

:println ["SUCCESS testing function, part 1]

参考:「標準Cライブラリ」 P.J.プラウガー=著 トッパン