@@ -949,3 +949,111 @@ assert Number.linearMap(
949949 0.5
950950) ==
951951 150
952+
953+ // Number.sin - 0 to pi/2
954+ assert Number.sin(0) == 0
955+ assert Number.isClose(Number.sin(Number.pi / 6), 1/2)
956+ assert Number.isClose(Number.sin(Number.pi / 4), Number.sqrt(2) / 2)
957+ assert Number.isClose(Number.sin(Number.pi / 3), Number.sqrt(3) / 2)
958+ assert Number.isClose(Number.sin(Number.pi / 2), 1)
959+ // Number.sin - pi/2 to 2pi
960+ assert Number.isClose(Number.sin(2 * Number.pi / 3), Number.sqrt(3) / 2)
961+ assert Number.isClose(Number.sin(3 * Number.pi / 4), Number.sqrt(2) / 2)
962+ assert Number.isClose(Number.sin(5 * Number.pi / 6), 1/2)
963+ // Note: This has an absolute error of 1e-15 because `Number.pi` is not exact
964+ assert Number.isClose(Number.sin(Number.pi), 0, absoluteTolerance=1e-15)
965+ // Number.sin - 2pi to 3pi/2
966+ assert Number.isClose(Number.sin(7 * Number.pi / 6), -1/2)
967+ assert Number.isClose(Number.sin(5 * Number.pi / 4), Number.sqrt(2) / -2)
968+ assert Number.isClose(Number.sin(4 * Number.pi / 3), Number.sqrt(3) / -2)
969+ assert Number.isClose(Number.sin(3 * Number.pi / 2), -1)
970+ // Number.sin - 3pi/2 to 0
971+ assert Number.isClose(Number.sin(5 * Number.pi / 3), Number.sqrt(3) / -2)
972+ assert Number.isClose(Number.sin(7 * Number.pi / 4), Number.sqrt(2) / -2)
973+ assert Number.isClose(Number.sin(11 * Number.pi / 6), -1/2)
974+ // Note: This has an absolute error of 1e-15 because `Number.pi` is not exact
975+ assert Number.isClose(Number.sin(2 * Number.pi), 0, absoluteTolerance=1e-15)
976+ // Number.sin - special cases
977+ assert Number.sin(1/2) == Number.sin(0.5)
978+ assert Number.sin(1/4) == Number.sin(0.25)
979+ assert Number.isClose(Number.sin(18_446_744_073_709_551_615), 0.0235985099) // 2^64-1
980+ assert Number.isClose(Number.sin(-18_446_744_073_709_551_615), -0.0235985099) // -2^64+1
981+ assert Number.isClose(Number.sin(18_446_744_073_709_551_616), 0.0235985099) // 2^64
982+ assert Number.isClose(Number.sin(-18_446_744_073_709_551_616), -0.0235985099) // -2^64
983+ assert Number.isClose( // Note: We lose a lot of precision here do to ieee754 representation
984+ Number.sin(1.7976931348623157e+308),
985+ 0.0049619,
986+ absoluteTolerance=1e7
987+ ) // Max F64
988+ assert Number.isClose(
989+ Number.sin(-1.7976931348623157e+308),
990+ 0.00496,
991+ absoluteTolerance=1e7
992+ ) // Max F64
993+ assert Number.isNaN(Number.sin(Infinity))
994+ assert Number.isNaN(Number.sin(-Infinity))
995+ assert Number.isNaN(Number.sin(NaN))
996+
997+ // Number.cos - 0 to pi/2
998+ assert Number.cos(0) == 1
999+ assert Number.isClose(Number.cos(Number.pi / 6), Number.sqrt(3) / 2)
1000+ assert Number.isClose(Number.cos(Number.pi / 4), Number.sqrt(2) / 2)
1001+ assert Number.isClose(Number.cos(Number.pi / 3), 1/2)
1002+ // Note: This has an absolute error of 1e-15 because `Number.pi` is not exact
1003+ assert Number.isClose(Number.cos(Number.pi / 2), 0, absoluteTolerance=1e-15)
1004+ // Number.cos - pi/2 to 2pi
1005+ assert Number.isClose(Number.cos(2 * Number.pi / 3), -1/2)
1006+ assert Number.isClose(Number.cos(3 * Number.pi / 4), Number.sqrt(2) / -2)
1007+ assert Number.isClose(Number.cos(5 * Number.pi / 6), Number.sqrt(3) / -2)
1008+ assert Number.isClose(Number.cos(Number.pi), -1)
1009+ // Number.cos - 2pi to 3pi/2
1010+ assert Number.isClose(Number.cos(7 * Number.pi / 6), Number.sqrt(3) / -2)
1011+ assert Number.isClose(Number.cos(5 * Number.pi / 4), Number.sqrt(2) / -2)
1012+ assert Number.isClose(Number.cos(4 * Number.pi / 3), -1/2)
1013+ // Note: This has an absolute error of 1e-15 because `Number.pi` is not exact
1014+ assert Number.isClose(Number.cos(3 * Number.pi / 2), 0, absoluteTolerance=1e-15)
1015+ // Number.cos - 3pi/2 to 0
1016+ assert Number.isClose(Number.cos(5 * Number.pi / 3), 1/2)
1017+ assert Number.isClose(Number.cos(7 * Number.pi / 4), Number.sqrt(2) / 2)
1018+ assert Number.isClose(Number.cos(11 * Number.pi / 6), Number.sqrt(3) / 2)
1019+ assert Number.isClose(Number.cos(2 * Number.pi), 1)
1020+ // Number.cos - special cases
1021+ assert Number.cos(1/2) == Number.cos(0.5)
1022+ assert Number.cos(1/4) == Number.cos(0.25)
1023+ assert Number.isClose(Number.cos(18_446_744_073_709_551_615), -0.99972151638) // 2^64-1
1024+ assert Number.isClose(Number.cos(-18_446_744_073_709_551_615), -0.99972151638) // -2^64+1
1025+ assert Number.isClose(Number.cos(18_446_744_073_709_551_616), -0.99972151638) // 2^64
1026+ assert Number.isClose(Number.cos(-18_446_744_073_709_551_616), -0.99972151638) // -2^64
1027+ assert Number.isClose(Number.cos(1.7976931348623157e+308), -0.99998768942) // Max F64
1028+ assert Number.isClose(Number.cos(-1.7976931348623157e+308), -0.99998768942) // Max F64
1029+ assert Number.isNaN(Number.cos(Infinity))
1030+ assert Number.isNaN(Number.cos(-Infinity))
1031+ assert Number.isNaN(Number.cos(NaN))
1032+
1033+ // Number.tan - base cases
1034+ assert Number.tan(0) == 0
1035+ assert Number.isClose(Number.tan(Number.pi / 6), 1 / Number.sqrt(3))
1036+ assert Number.isClose(Number.tan(Number.pi / 4), 1)
1037+ assert Number.isClose(Number.tan(Number.pi / 3), Number.sqrt(3))
1038+ // Note: one might expect this to produce infinity but instead we produce 16331239353195370 because pi can not be represented accurately in iee754, This logic follows c
1039+ assert Number.isClose(Number.tan(Number.pi / 2), 16331239353195370)
1040+ // Number.tan - special cases
1041+ assert Number.tan(1/2) == Number.tan(0.5)
1042+ assert Number.tan(1/4) == Number.tan(0.25)
1043+ assert Number.isClose(Number.tan(18_446_744_073_709_551_615), -0.02360508353) // 2^64-1
1044+ assert Number.isClose(Number.tan(-18_446_744_073_709_551_615), 0.02360508353) // -2^64+1
1045+ assert Number.isClose(Number.tan(18_446_744_073_709_551_616), -0.02360508353) // 2^64
1046+ assert Number.isClose(Number.tan(-18_446_744_073_709_551_616), 0.02360508353) // -2^64
1047+ assert Number.isClose( // Note: We lose a lot of precision here do to ieee754 representation
1048+ Number.tan(1.7976931348623157e+308),
1049+ -0.00496201587,
1050+ absoluteTolerance=1e7
1051+ ) // Max F64
1052+ assert Number.isClose(
1053+ Number.tan(-1.7976931348623157e+308),
1054+ -0.00496201587,
1055+ absoluteTolerance=1e7
1056+ ) // Max F64
1057+ assert Number.isNaN(Number.tan(Infinity))
1058+ assert Number.isNaN(Number.tan(-Infinity))
1059+ assert Number.isNaN(Number.tan(NaN))
0 commit comments