ref: 83fea560c31e90807d9a2fa25a749027812ea17f
dir: /lib/math/test/sin-impl.myr/
use std use math use testr const main = { math.fptrap(false) testr.run([ [.name="sin-cos-01", .fn = sincos01], /* flt32 */ [.name="sin-cos-02", .fn = sincos02], /* flt64 */ [.name="sin-cos-03", .fn = sincos03], /* off-by-1-ulp quarantine */ [.name="sin-cos-04", .fn = sincos04], /* exhaustively test C */ [.name="sin-cos-05", .fn = sincos05], /* NaN handling */ ][:]) } const same32 = {a, b if a == b -> true ;; if std.isnan(std.flt32frombits(a)) && std.isnan(std.flt32frombits(b)) -> true ;; -> false } const same64 = {a, b if a == b -> true ;; if std.isnan(std.flt64frombits(a)) && std.isnan(std.flt64frombits(b)) -> true ;; -> false } const sincos01 = {c var inputs : (uint32, uint32, uint32)[:] = [ (0x00000000, 0x00000000, 0x3f800000), (0x3f000000, 0x3ef57744, 0x3f60a940), (0x6e000000, 0xbec002e4, 0xbf6d50ea), (0xeca5b501, 0x3f6e879c, 0x3eb9e60c), (0x67a9242b, 0xbf7fab81, 0xbd4fee38), (0xdf18b878, 0xbdad60f7, 0x3f7f14bb), (0x5f18b878, 0x3dad60f7, 0x3f7f14bb), ][:] for (x, ys, yc) : inputs var xf : flt32 = std.flt32frombits(x) var rsf1, rcf1, rsf2, rcf2 (rsf1, rcf1) = math.sincos(xf) rsf2 = math.sin(xf) rcf2 = math.cos(xf) var rsu1 = std.flt32bits(rsf1) var rcu1 = std.flt32bits(rcf1) var rsu2 = std.flt32bits(rsf2) var rcu2 = std.flt32bits(rcf2) testr.check(c, rsf1 == rsf2 && rcf1 == rcf2, "sincos(0x{b=16,w=8,p=0}) is (0x{b=16,w=8,p=0}, 0x{b=16,w=8,p=0}), individual results (0x{b=16,w=8,p=0}, 0x{b=16,w=8,p=0})", x, rsu1, rcu1, rsu2, rcu2) testr.check(c, same32(rsu1, ys) && same32(rcu1, yc), "sincos(0x{b=16,w=8,p=0}) should be (0x{b=16,w=8,p=0}, 0x{b=16,w=8,p=0}), was (0x{b=16,w=8,p=0}, 0x{b=16,w=8,p=0})", x, ys, yc, rsu1, rcu1) ;; } const sincos02 = {c var inputs : (uint64, uint64, uint64)[:] = [ (0x0000000000000000, 0x0000000000000000, 0x3ff0000000000000), (0x4100000000000000, 0xbfeff8bd7b10d6b0, 0x3fa58ced65ec8b50), (0x4b11000000000000, 0xbfef2cb48ed49aa6, 0x3fcce246843789ad), (0x020400000a0c0000, 0x020400000a0c0000, 0x3ff0000000000000), (0xbfeff57020000000, 0xbfeae79e2eb87020, 0x3fe1530a59ef0400), (0x44f5248560000000, 0xbfeff57010000001, 0xbfa9fdc6fcf27758), (0xc3e3170f00000000, 0xbfb5ac1ed995c7c4, 0x3fefe29770000000), (0x41bb951f1572eba5, 0xbc8f54f5227a4e84, 0x3ff0000000000000), /* [GB91]'s "Xhard" */ ][:] for (x, ys, yc) : inputs var xf : flt64 = std.flt64frombits(x) var rsf1, rcf1, rsf2, rcf2 (rsf1, rcf1) = math.sincos(xf) rsf2 = math.sin(xf) rcf2 = math.cos(xf) var rsu1 = std.flt64bits(rsf1) var rcu1 = std.flt64bits(rcf1) var rsu2 = std.flt64bits(rsf2) var rcu2 = std.flt64bits(rcf2) testr.check(c, rsf1 == rsf2 && rcf1 == rcf2, "sincos(0x{b=16,w=16,p=0}) is (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), individual results (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0})", x, rsu1, rcu1, rsu2, rcu2) testr.check(c, same64(rsu1, ys) && same64(rcu1, yc), "sincos(0x{b=16,w=16,p=0}) should be (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), was (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0})", x, ys, yc, rsu1, rcu1) ;; } const sincos03 = {c var inputs : (uint64, uint64, uint64, uint64, uint64)[:] = [ (0x5101000000000000, 0x3fe9706123d509f1, 0xbfe369af9695aba1, 0x3fe9706123d509f0, 0xbfe369af9695aba0), (0xf83b13a6a142b6d5, 0xbf5a86f4edeb02f2, 0x3feffffd404efc20, 0xbf5a86f4edeb02f1, 0x3feffffd404efc20), (0x4b01000000000000, 0xbfe3e9527dc75f12, 0x3fe90cf80997c963, 0xbfe3e9527dc75f13, 0x3fe90cf80997c964), ][:] for (x, ys_perfect, yc_perfect, ys_acceptable, yc_acceptable) : inputs var xf : flt64 = std.flt64frombits(x) var rsf1, rcf1, rsf2, rcf2 (rsf1, rcf1) = math.sincos(xf) rsf2 = math.sin(xf) rcf2 = math.cos(xf) var rsu1 = std.flt64bits(rsf1) var rcu1 = std.flt64bits(rcf1) var rsu2 = std.flt64bits(rsf2) var rcu2 = std.flt64bits(rcf2) testr.check(c, rsf1 == rsf2 && rcf1 == rcf2, "sincos(0x{b=16,w=16,p=0}) is (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), individual results (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0})", x, rsu1, rcu1, rsu2, rcu2) testr.check(c, (same64(rsu1, ys_perfect) || same64(rsu1, ys_acceptable)) && \ (same64(rcu1, yc_perfect) || same64(rcu1, yc_acceptable)), "sincos(0x{b=16,w=16,p=0}) should be (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), will also accept (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), was (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0})", x, ys_perfect, yc_perfect, ys_acceptable, yc_acceptable, rsu1, rcu1) ;; } const sincos04 = {c /* There should be one of these for each j, each corresponding to the appropriate xi. This should ensure that, when upgrading the C tables, things don't get too terribly broken. */ var inputs : (uint64, uint64, uint64)[:] = [ (0x00000000000000f6, 0x00000000000000f6, 0x3ff0000000000000), (0x512272897288fc3f, 0xbf74c1fa7a394e5a, 0xbfefffe511d2bf60), (0xbf7bf1bf57973983, 0xbf7bf1b122b6a164, 0x3fefffcf31e20334), (0x54b7c50a7a9883cb, 0xbfefff7870aeb34e, 0xbf874920cd9ace22), (0xdace0787a600a1ca, 0x3f8b9ca34b1db23a, 0xbfefff416335fa92), (0x72864769869c2318, 0x3feffeddc1ece35c, 0xbf910931b7190c35), (0xd91723aa83b79cb9, 0xbf942999d22d35b9, 0x3feffe696f1dc7b2), (0x475f423e817765ea, 0x3f96b423c56f5447, 0xbfeffdfc7adf3a9d), (0xe6ea21331235f850, 0xbf9c0c0fa6749f60, 0xbfeffced3639af5a), (0x6d2a3c2098179905, 0xbf9f11a72b55a41b, 0xbfeffc3a7f66553b), (0xf28fa3bd259e1376, 0xbfeffc23303dea74, 0xbf9f71111b7fd616), (0x7f26be7ff1138291, 0xbfa185023632479d, 0xbfeffb33e657eb59), (0x675c32e626080a1e, 0x3feff9b5b177af51, 0xbfa40f7a6e6b7994), (0x52924d2cbb5901d1, 0x3fa48c4b82d66c9b, 0x3feff9666f07db89), (0x417ec533964706ec, 0x3fa64f235d1be278, 0x3feff83843b411af), (0x52107ea0ff1110db, 0xbfeff6a3fc169867, 0x3fa877b2347f0a28), (0xd71b728c627f815d, 0x3faa8d784340586e, 0xbfeff4f9ef7c5107), (0xda739024569252ce, 0x3feff3eee1e5663a, 0x3fabc79919273897), (0xdb96494b55f3f081, 0xbfeff24bb7274d9e, 0x3fad9a5e1c7820a2), (0x739f3c2a746a1b50, 0xbfeff19570cd1d86, 0x3fae5c932d2f3605), (0x447aa716086a8c88, 0xbfb05ec5a49745a1, 0x3fefef3bdef16841), (0xf968280b3a414e54, 0xbfb12ed0ae4aeb09, 0xbfefed86a66a999f), (0xd02fb5bd9a62c870, 0x3fefebdb551c9f8e, 0x3fb1f1029914d91e), (0x60ffe411eafbc6da, 0x3fb245acb57399e6, 0x3fefeb1b39d132e8), (0x4f318e7d4aea96dc, 0xbfefe7f62e48f0eb, 0x3fb398e0aeb9c445), (0xc404978c116309d8, 0x3fb423d6b3b85040, 0x3fefe69c043f3e90), (0x43f2630170779582, 0x3fb5177a797d0e87, 0xbfefe4261d504451), (0x5fdbbf61f00b7f03, 0xbfefe38d527600ca, 0xbfb550ed5bee6d60), (0xc0197a1d458871ce, 0xbfb6018646c93b7b, 0x3fefe1ad70c7618a), (0xfec0c7c70c5fef38, 0xbfb72b204c19e155, 0xbfefde61e65655a4), (0x536118c6d0da429d, 0xbfb813122d1d4d33, 0x3fefdbb21abcadb1), (0x468bde452261d739, 0xbfefd95e3ccfcb94, 0x3fb8d51e4332cdff), (0x640531fd736dc271, 0xbfb9cb4924d9690e, 0xbfefd64f7c8c42d5), (0x45882463c54dff4d, 0x3fba4eb0d809a756, 0xbfefd4a15a83accd), (0xe47b0287f9f402c4, 0x3fbb4f875473f88e, 0xbfefd13fe58f7d94), (0x776a9cb59bc714b1, 0x3fefd05ef4cb673b, 0x3fbb90bc6355a021), (0x6e03d54eae350b2b, 0x3fbc40e4b1fc64b5, 0x3fefcdf4b6ba3d60), (0xd7e13510abfa4b8f, 0xbfbd8c17b8daf635, 0x3fefc9408a0ed455), (0xf5b0b388d525a652, 0x3fbe06c30febf5ed, 0xbfefc774aca78be1), (0xc872046ad7b74e5d, 0xbfefc4762a3df5f2, 0xbfbeceee72729a95), (0xe7de05b2f658e70f, 0xbfbf705c3c62b429, 0xbfefc1fd7092a24b), (0xcc324b95dbc8fd01, 0x3fc0705192fdc54c, 0xbfefbc2939080e96), (0xf721d915cf272a16, 0xbfefbb27b38fdf96, 0xbfc08f4641cf4d68), (0x727b9da90c1b363d, 0x3fefb822c42d1549, 0xbfc0ead5e194ff63), (0x76833092f555af28, 0xbfc16fc26448ec57, 0xbfefb3a2bb1657ce), (0x4aee1902b654832c, 0x3fefb04eed8111ec, 0x3fc1cf8146eca7eb), (0x4baf9ffda9dc11e3, 0x3fefac8684367fbe, 0xbfc239ecfe4bf73d), (0x5657a3059c18f2d9, 0xbfc297363782e038, 0xbfefa922de862569), (0x7bff45dd88b13800, 0xbfc2d478620b4e02, 0xbfefa6df905ff50e), (0x5dee435102358eaf, 0x3fefa1b101e4c684, 0xbfc35dd586187ce4), (0xde9d9f0cc9f77177, 0x3fc3defc1325ae88, 0x3fef9caef7a753cc), (0xfdda28f4488d7a83, 0xbfc415283aea05a2, 0x3fef9a8b282c574d), (0xf50af38a50f30e4c, 0xbfc4730a16260b3b, 0xbfef96c7b1abe323), (0xfb496fa21c023920, 0x3fc4cea2d28cfdfb, 0x3fef930a70b822c6), (0xe505ecdfee427dbd, 0x3fc554226a887900, 0x3fef8d78b9f34b72), (0xeb0d8c0df28dd71b, 0x3fc5b337c0fb9e5e, 0xbfef896b2289c5b2), (0x7509b2527112fd5b, 0xbfc630b105366287, 0x3fef83f5ac088905), (0xffd6c9165e18ac33, 0x3fef81c853e8136a, 0xbfc661f1ad0ce950), (0xe1c86c04b0706291, 0xbfef7d873a6519fe, 0x3fc6c0f2cce48329), (0x7f4ab100fd15ade5, 0x3fc7148e0c9e3182, 0x3fef79b97d3d745b), (0x4b1f0b0b22dfeef3, 0xbfc7c4eeb85ba3ff, 0x3fef718430c69651), (0xcb9bb37fc0f2a235, 0xbfc7d6435e271ea1, 0x3fef70b2445b8479), (0xd6e8414566d4c52e, 0xbfef6a8b61c9b366, 0x3fc856b04dcf03ea), (0xe79fb9553990f8be, 0xbfef64d85f36d000, 0xbfc8cb42fe24375f), (0x6dcb241574906b9f, 0x3fc9451b9809f028, 0x3fef5ec551a7ce80), (0xd35310f2b682fb52, 0x3fc976452c4ba67d, 0x3fef5c492d13c71d), (0x49b456519453bc2e, 0xbfef5770a5a4ac32, 0x3fc9d50bf14496e0), (0x59d7185ea4188d7a, 0x3fca6cd56e57cc8a, 0xbfef4f86fdc2aa14), (0xfddefd05372bf5b1, 0xbfca83aa03c4c548, 0x3fef4e52288add54), (0x7b7322413d2ae5f8, 0x3fef46fc203fc847, 0xbfcb0ccdf3f26a28), (0x6360cbf4cc0e423a, 0xbfcb8abc4d3fbf70, 0xbfef401cf3b2c8ad), (0xc2ef40aac8c0caff, 0xbfef3b40e2b1c574, 0x3fcbe2633bec6338), (0xc2ef40aac8c0caff, 0xbfef3b40e2b1c574, 0x3fcbe2633bec6338), (0x7517b932422321b3, 0xbfcc7c0a66359b8f, 0x3fef329516485b7e), (0x4d40e5da1750b47b, 0x3fccecafe584ca7a, 0x3fef2c1a191c72da), (0xd3eeab6f1ce0c65f, 0x3fef275dde80b9a5, 0xbfcd3ddea87ad082), (0x7332b1c80505c25d, 0x3fcdd243aeac42e6, 0xbfef1e91f34d9e70), (0xdd7f47ace75b1278, 0xbfef1ba6ee071cfd, 0x3fce02d275470464), (0xf6deca320321040f, 0x3fef1188ee0ff435, 0xbfcea8b76971a173), (0xde7018284f03e03f, 0x3fef0acf75273337, 0x3fcf14f3f457127c), (0x5a35f121d3d2a2e7, 0x3fcf3fb1a0b5d9eb, 0x3fef0820c67c621a), (0x5f8789fe1295b431, 0xbfcf801328302267, 0xbfef040f08a74b86), (0xeb60edaa99fb631b, 0xbfcff6c4e0ab7ecf, 0xbfeefc7723cce8e8), (0x740043f1ff2cdc39, 0x3feef58264f03ec2, 0xbfd030f4ca52cdfd), (0x755909d7a66ec123, 0x3fd05b0aacb3547b, 0xbfeeeffa179a7126), (0xce7378a1c330830a, 0xbfd092eb3679cee6, 0xbfeee889fe5671b2), (0x61229f2e883ad502, 0x3feee354dcbf5384, 0xbfd0b993622b89d8), (0xc308cff80474c43c, 0x3fd0f14e25183c0c, 0xbfeedbbc1b54a4a4), (0x5474ef4a0497c293, 0x3fd11f8458f1b696, 0xbfeed55af85d48b3), (0x64a85b58557d81d6, 0xbfd16ead3eb9741d, 0xbfeeca421433b493), (0xf77724543b8b3885, 0x3fd19ed46e8f52e9, 0x3feec36716fdec27), (0x464183db1f445d09, 0x3feec26f93025caa, 0xbfd1a593925c8dc8), (0x778eae02a44000a2, 0xbfeebb73eb5aed84, 0x3fd1d5fba8930f8f), (0x5cdc5f4b5e0d1940, 0xbfd224373cb42c70, 0x3feeafff121ff829), (0x525e3d38881ed63d, 0x3feea6cd7f0438c8, 0xbfd261f9b2e4fa14), (0x5a10e8f3294cb8da, 0xbfeea58f1791757a, 0x3fd26a434e6e77e4), (0x4fc23cca0a71ea3a, 0x3fee9b1b63dc509c, 0x3fd2af49e08c3126), (0xf60fe4b87e3c1da9, 0xbfd2d96cd21892d2, 0xbfee94a51d4d7187), (0xf57c4045e43ccaf9, 0xbfee8e15317f07be, 0x3fd303ce72c3ddcb), (0xfbba53b7ccff6358, 0xbfd337ace7d8abf2, 0x3fee85f74296d316), (0x7c92ab74e6d83f53, 0x3fee7e33cfcfc9c9, 0x3fd368bac190b88b), (0x6aa52ba172654ed1, 0x3fd3a3c7bd76153b, 0x3fee74be8564f496), (0x5c6e0f3ec20f8e7d, 0x3fee6c801bff99d9, 0x3fd3d6a1b9e825a9), (0x44438c0b81cf287e, 0xbfd3f7fb8049f941, 0xbfee670b3f6d116a), (0xe9eeb63337ece529, 0x3fd42bb1af27955a, 0x3fee5e814f8fa4ee), (0xd05cf079494581b4, 0xbfee58a3bd5aaaad, 0x3fd44ee2b0defb88), (0x685f1a87b750f254, 0xbfd4a144f9e741c4, 0xbfee4abc1dcdf720), (0x536b65af59fbc622, 0x3fee477e3635fcdf, 0x3fd4b4458e9e69ef), (0xdd2564daf3c4e467, 0x3fd4f0c8e7efe5da, 0xbfee3d15289f8043), (0x7fa52667c976d82e, 0xbfee3a08ee598072, 0xbfd5025b4e066b88), (0x72f883ad82e4a3ba, 0xbfee2fdf26ce794e, 0xbfd53c7e2146d269), (0xf6e835bc9adeaf59, 0xbfd57c6ac4883fb5, 0x3fee248e035dacb0), (0x42ea8e91bba3889d, 0x3fee202b02dd668d, 0xbfd594f8cca01aba), (0x58b1d3f25c054d48, 0x3fee179309c7e2fe, 0xbfd5c4b8add182bf), (0xe9e2cd65f67e2ee0, 0xbfee0dd7bea36726, 0x3fd5fa3dc3a4f8c7), (0x6b9ffac3db03a107, 0x3fd631fb285e219d, 0xbfee039865991e53), (0x6eb4d607fe115dcf, 0x3fedfa4b939ca0ac, 0x3fd66409024e6323), (0xf7917095f9a51925, 0xbfd69796d53fd17f, 0xbfedf09e862de5d1), (0x7118f8c15e2991c4, 0x3fedeb8848f6cf5b, 0xbfd6b27ba1696913), (0x79b55f3637cc4586, 0xbfd6f5638f450935, 0x3feddec291264c5d), (0x5fd1cfe5b08757a6, 0xbfd70ffb893ab566, 0x3fedd9a2fedb6c24), (0xc733503522b5f461, 0xbfd7554c3b69eebf, 0xbfedcc2869cbf541), (0x446d7c038f34a64a, 0x3fedc88bba34e66a, 0x3fd767b74c87b19e), (0xc3a23c3b9032b8f3, 0x3fd79831044581c9, 0xbfedbefa4c29de60), (0xc48d690c9e9f2305, 0xbfd7e8fd81ac1776, 0xbfedaed4c0b2b8f3), (0x6936ad82b0657c14, 0x3fd7f3be25e63b3f, 0xbfedaca9dc90a41b), (0x4d4c51754594c5a7, 0xbfed9c8f1505a0bd, 0xbfd842f47bbbff65), (0x53af975d069ceebf, 0x3fed98ae77ed0af4, 0xbfd855d9e1b87671), (0xbfd929812210b263, 0xbfd884d5b1521b6a, 0x3fed8efb1e579d8f), (0xf311b32b3a68939e, 0xbfed856f902db836, 0xbfd8b2aaa6160a9f), (0xc8bb45b934289a6f, 0xbfd8e9ef0de3dc36, 0xbfed79d12674cd54), (0xcf7f65187e57f8e0, 0x3fed6bc8263fc275, 0x3fd92bf37a97badc), (0xc8e046f199566a7b, 0x3fed61acdd8efca5, 0x3fd95aff9d017381), (0xe63586b4c42da14f, 0x3fd992a9570938bd, 0xbfed559aec9c0440), (0x7570d9f0f3faa4e7, 0x3fed51bace294110, 0xbfd9a46a32ec9b5d), (0xf6bb3c9916ba9b7b, 0x3fed454543bc2de4, 0x3fd9dd1b108a60cc), (0xd660ed6e55136cdf, 0x3fed37afb7050a25, 0x3fda1a4302c68bf6), (0x429a8fa0df460917, 0x3fed2f17f136daf1, 0xbfda409a52187af7), (0xebf471a9b1b6caa5, 0xbfda64f02f41d321, 0x3fed26e544de1649), (0xe65e21ead3c2ba60, 0xbfed22498d657c09, 0x3fda7942a404499c), (0x6ae3d5db498749f6, 0xbfed0e459db364cf, 0xbfdad0af537af3fc), (0x76bc0ffdf6576c1d, 0xbfdaf074aec69954, 0xbfed06ebcd22c8e7), (0x576061576fcdadfd, 0x3fecfe0996e5d249, 0x3fdb169da2f019c9), (0xe9922b0dd12503ba, 0x3fdb3e68e31cf5d6, 0x3fecf4b5b421be75), (0xf090512b08c64f2b, 0x3fece4479edc03c5, 0xbfdb83d63f9cb587), (0xc9064cce58144c06, 0x3fdbb290774db3ef, 0x3fecd91bf6c9a299), (0xd2c65def3f53a9b7, 0x3fdbd52702603513, 0x3fecd0c83afda1b0), (0xc366379b9a957cdb, 0x3fdc01b0c4b0e4d4, 0x3fecc5fc650dfa55), (0x739d5edf97b83065, 0xbfdc2b7a687242b7, 0x3fecbbc7dbedc827), (0xc40021d66b2f4d61, 0xbfdc4d9c4f8f51e7, 0xbfecb363f1bca281), (0xc76aa2fdbe146487, 0x3feca866fe836c4e, 0xbfdc7a02cee3d6de), (0x7738dad760be3d56, 0xbfec9933d62aa560, 0xbfdcb6e1350e6fb2), (0x666928445c6724e3, 0xbfec91c8c33109d5, 0x3fdcd45bdedee292), (0xc1a41b02da9ba0ea, 0x3fec863b137bd6e1, 0x3fdd01fa8ac7aa24), (0x7848fe3e78cb663c, 0xbfec79f540706d37, 0x3fdd320e30bad112), (0x5be9ac5535d046cc, 0xbfdd69dbc3730780, 0x3fec6b965f72d6d9), (0x7d00750f7493ec14, 0x3fec63edee9d4c7e, 0x3fdd8761eaf89474), (0x70b08a0803a2e4f7, 0x3fddab0ae8940bb3, 0x3fec5aa10a89a08b), (0x55fbd54cc4be5f3c, 0x3fdddcb4a70293c4, 0x3fec4d956bba1326), (0xf3554e8402f6265a, 0x3fde1f406db596ad, 0xbfec3beecfce2cf7), (0xd1c4f6c0576b4ceb, 0x3fde321eb7b4e647, 0x3fec36e47718b312), (0x7d59507f71b8f889, 0xbfec27de7468cb95, 0x3fde6a02a16464fe), (0xdc7e5afce57e9cd7, 0x3fdea90fe172c6c6, 0xbfec16c09e490bad), (0xeb073e7d1af5222d, 0xbfdec9544c37d497, 0xbfec0dec6f134e6c), (0xc60882772b865dc5, 0x3fec07c509e4da5b, 0x3fdedfb80fb87768), (0x75dc9fbbd1640b6a, 0xbfebf854a6961d91, 0xbfdf1787a24fb4b4), (0x633901c12d4cb6e1, 0x3fdf4c84cada936a, 0x3febe98a62583ac2), (0x7f04dacd2c2ca8ce, 0xbfebe3a53f98fb9a, 0xbfdf6182e7252bac), (0x4332ecebbe152c9a, 0xbfebd268556dddea, 0xbfdf9e7c5618737b), (0x5ac66c5d9fa15663, 0x3fdfc21149cd81f9, 0x3febc844c23cdafa), (0xc404cdd7bc992e30, 0x3febb629d34f27fa, 0xbfe0008c6d07e1bd), (0xc53d64204fdf1db3, 0xbfebafa459158ca0, 0x3fe00bd23ae3931f), (0xf9d4afa07a8a6ce7, 0xbfeba1a3c12f4839, 0x3fe023e2f03b637d), (0x637f1d1420fea3f8, 0xbfe0448291240078, 0x3feb8e7b76ad81a3), (0x72eae57421307d45, 0xbfeb849a47abb68b, 0x3fe05533525f37a3), (0xc2e6fa2f34fd750b, 0x3feb7482e375b78d, 0xbfe070318df28781), (0x6d7ed298ca67fbc5, 0x3feb65bbbbb39c6c, 0x3fe088c7245680ca), (0x4d744a5ecf95fd93, 0xbfe08d4873b04602, 0xbfeb630334f1eee3), (0xd0b010cb5af6b5b1, 0xbfe0a62065b173bc, 0x3feb53effed8251e), (0xfa89d1a75f768cd0, 0x3feb42d7b90ec7ad, 0x3fe0c20f7c61cec5), (0x6ce2de1511d237eb, 0x3fe0ce8b7293b359, 0xbfeb3b2725681250), (0x56a33b90bd51784c, 0x3fe0e8cc84a7b798, 0x3feb2ae16eac76c8), (0xd998ed50ac13add1, 0x3feb20901b10690f, 0x3fe0f954fc1fd74a), (0xd2573e1a86722c43, 0xbfeb0fa0f7a8064b, 0xbfe114476b668554), (0x498c3881301c9450, 0xbfeafe2803de2552, 0xbfe12fd761d178a8), (0x676028d2e9aa9de4, 0x3feaf378b320bee9, 0xbfe14093da4a17db), (0x4e22da5810e48e2c, 0xbfeae18365d0ce13, 0xbfe15c81b1c187a4), (0xfc2b1173d2f9d7c5, 0x3fe16349ac5ca8bf, 0x3feadd20fb79cee5), (0x7473a4f18d083564, 0xbfe1853ad10a9564, 0x3feac70a53c134e8), (0xfb85676d181e0881, 0xbfe19133a8342b55, 0xbfeabf312f9ba36c), (0x6269a55fd3dcfce2, 0x3fe19f8d1330bb0a, 0xbfeab5befc7864f0), (0x4598ddfdd67bf239, 0x3fea9eb39a3896ce, 0x3fe1c248efe0508e), (0xd95338bde4d930aa, 0xbfe1d9d6772be796, 0x3fea8eee09962254), (0x611503484c027608, 0x3fea8b32e1adee9a, 0xbfe1df6247815710), (0x5c2ee2e8eb412270, 0xbfe1f6da5410afd9, 0x3fea7b56645112df), (0xcb58f3d014fca0aa, 0xbfea66537cfebec2, 0x3fe215acd67cbd00), (0x43c6b36129529847, 0xbfea610121a2376e, 0xbfe21d6f232602fd), (0xfa1614294a9f72c8, 0x3fea49e8d6077dc7, 0x3fe23ee2fa2c432c), (0x473b0851ec7a71fc, 0xbfea3ae9bc9717ab, 0xbfe2546b8f878bb2), (0xf6d74bab0f0688d3, 0x3fe26ad4d6d860df, 0x3fea2b3235d28e02), (0xe9bee3b9d2c67c03, 0xbfe26e2812e3c037, 0x3fea28dacda84df7), (0xcc92e4c94a84e291, 0x3fe285c9915a00bf, 0xbfea1824b911e6c7), (0xf8aab297bc40c6d3, 0xbfe2a8efe687cdd7, 0x3fe9ff0dac00a59e), (0x6bfb68a736eeb1b6, 0x3fe2b1176d2ab489, 0x3fe9f931533ac9e4), (0xcf94cd7e76b5d43b, 0x3fe9eefebc7842b3, 0x3fe2bf3ae0fb4f01), (0x58e19d8279e73d8c, 0x3fe2e269a7c9fff8, 0x3fe9d56b655c37fc), (0x4c2f18aaaae1a9a5, 0x3fe9c6856bb54b0c, 0x3fe2f6ba53166329), (0x4473bbb450eb9885, 0xbfe9bd919cb7c452, 0xbfe302df564ec155), (0x5352f27ad3264f74, 0xbfe3105c54f5cb4c, 0xbfe9b395db2fe1b5), (0xd70c16903457ac91, 0xbfe32d9f9dbb21f9, 0xbfe99dc756e89b3d), (0xcac2e8c8c586b2d1, 0xbfe345aa02d0e659, 0xbfe98bb610c6fd7a), (0x72d7978807cae706, 0xbfe35d2b78fbd0b9, 0x3fe979e9612ca3a5), (0xe6c2f09d247a94a9, 0xbfe36b250c0e3485, 0x3fe96f44150abf2c), (0xfa6723c5149699bc, 0xbfe95f43f91aa66f, 0xbfe380085ac23ee0), (0xff8223b58fd12c2f, 0x3fe94bba9f307406, 0xbfe39959860b58ec), (0x75296e4dd81e95f4, 0x3fe3a3e75e16aa44, 0x3fe94389b95f2efa), (0x7e5b65a329da9204, 0x3fe3c1f15c9eb331, 0xbfe92c12b84a4ade), (0xee3f0726908f6f7e, 0xbfe91cc6ea4e16dc, 0x3fe3d55ed2290c82), (0x7af275b9d87202c4, 0x3fe3d7db0cdad96d, 0x3fe91ad03ab42e84), (0x58404c6817fb0387, 0xbfe3ecf399bb98a3, 0x3fe90a151c0f3a99), (0x4e24e759fc383d3b, 0x3fe8f9c1d2e98eb7, 0xbfe401664bfe107a), (0x6e6e238154fe510b, 0xbfe8dc876efe2cea, 0xbfe425ad5d3088a4), (0x51115721fcb875a5, 0x3fe8ce38b96c431d, 0xbfe4374857dced36), (0xcd0f08fce53215fe, 0x3fe44b7fa906b663, 0x3fe8bdb137695bac), (0xc793de849b92e545, 0x3fe8ae29fd1807b2, 0xbfe45e5f09a79710), (0xf14f3d838006f1f3, 0x3fe8a0e6c0cb53d4, 0xbfe46e665c9bfa98), (0x485b3050ec24e894, 0xbfe89ac1501c4664, 0x3fe475ccc67a5a6f), (0x53cdd772c04825b7, 0xbfe499d932904180, 0xbfe87c9a6ee0e5f4), (0xf3830e1d9fcb8a63, 0x3fe49ee7f784dc34, 0xbfe878583c6d1b17), (0x4fd516dfb479c284, 0xbfe4b8fa646a8702, 0x3fe86247ec1b5405), (0x401c9636ba305733, 0x3fe852f4e454503a, 0x3fe4caf517981ddf), (0x74e6629d161dcdf0, 0x3fe84b4f58913c4f, 0x3fe4d3e3c394b4c3), (0xc831ccafeb5988ca, 0xbfe4e9f00dc7029d, 0x3fe8385704515fc8), (0xea8b6c2e5b7438e9, 0xbfe821d634afb0ed, 0x3fe503e361ffde43), (0x50ddbc2d3d77331b, 0xbfe51e8f21a24dd4, 0xbfe80a82564c99e1), (0xd31f8e19edda2f9a, 0x3fe802894421cfd0, 0x3fe5279f1e05c5c6), (0xfbb16b339d0a17fe, 0xbfe542cec6203a63, 0xbfe7ea79c4f28160), (0xfe93c58449c8fd51, 0x3fe7e653ec9effe6, 0xbfe547784cf0eeb5), (0xe125d9535e1d7d96, 0x3fe56a646c9bc577, 0xbfe7c70e160b76ba), (0xe9492784719b40f6, 0xbfe7bd8d74e13697, 0x3fe574eca79f247d), (0x76693dbf45a5c11c, 0x3fe7a6aca203b146, 0x3fe58e21d55361dd), (0xca01a90ba147a7a8, 0x3fe7a0e9b1cc2382, 0x3fe594727d17c430), (0xeba7b196f2ce8a86, 0x3fe792dcb3fd68a0, 0x3fe5a3caee7bef45), (0x65cec0767168cebc, 0xbfe781dbdad094ee, 0xbfe5b64237c79451), (0xe46e9ddaa8d41951, 0xbfe76df89a6184ca, 0x3fe5cbb6beaf19d3), (0xc394901bb60cd165, 0x3fe5e7e07a75103e, 0xbfe753a5e9dd67ee), (0xefe39e4669e6b8e3, 0xbfe5ee1e7c908e91, 0xbfe74dc7ad48a603), (0x6606d5cab1344ed4, 0xbfe60bbb919e2739, 0x3fe731c5d36a20ec), (0xe151f4cddef4501f, 0xbfe7201c54d669d7, 0xbfe61e41c6dae1e5), (0xd9381aa73bb196ba, 0xbfe719018e9ef492, 0xbfe625acfdb6514e), (0x4de08bca51af503b, 0xbfe7060f07286185, 0xbfe6395ed52b7540), (0x43ba67829cbf5ddd, 0xbfe64d04587eee54, 0xbfe6f307ef31a64f), (0x51c3d8b11e8e3186, 0x3fe664fbc2d6363c, 0x3fe6dba5765c9f8b), (0x762158955b8d3e1f, 0x3fe67b88d77e47ab, 0xbfe6c577911c77f9), (0x7e1f8126bc820e3d, 0x3fe685a6ed43a0f0, 0x3fe6bb75e2686a13), (0x77c0705a72b5023d, 0x3fe69d4e28e80836, 0x3fe6a3ee27f25da6), ][:] for (x, ys, yc) : inputs var xf : flt64 = std.flt64frombits(x) var rsf1, rcf1, rsf2, rcf2 (rsf1, rcf1) = math.sincos(xf) rsf2 = math.sin(xf) rcf2 = math.cos(xf) var rsu1 = std.flt64bits(rsf1) var rcu1 = std.flt64bits(rcf1) var rsu2 = std.flt64bits(rsf2) var rcu2 = std.flt64bits(rcf2) testr.check(c, rsf1 == rsf2 && rcf1 == rcf2, "sincos(0x{b=16,w=16,p=0}) is (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), individual results (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0})", x, rsu1, rcu1, rsu2, rcu2) testr.check(c, same64(rsu1, ys) && same64(rcu1, yc), "sincos(0x{b=16,w=16,p=0}) should be (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0}), was (0x{b=16,w=16,p=0}, 0x{b=16,w=16,p=0})", x, ys, yc, rsu1, rcu1) ;; } const sincos05 = {c testr.check(c, std.isnan(math.cos(std.flt64nan())), "cos(NaN64) should be NaN") testr.check(c, std.isnan(math.sin(std.flt64nan())), "sin(NaN64) should be NaN") testr.check(c, std.isnan(math.cos(std.flt32nan())), "cos(NaN32) should be NaN") testr.check(c, std.isnan(math.sin(std.flt32nan())), "sin(NaN32) should be NaN") var s1, c1, s2, c2 (s1, c1) = math.sincos(std.flt64nan()) testr.check(c, std.isnan(s1), "sincos(NaN64) should be (NaN, NaN)") testr.check(c, std.isnan(c1), "sincos(NaN64) should be (NaN, NaN)") (s2, c2) = math.sincos(std.flt32nan()) testr.check(c, std.isnan(s2), "sincos(NaN32) should be (NaN, NaN)") testr.check(c, std.isnan(c2), "sincos(NaN32) should be (NaN, NaN)") }