Skip to content

Instantly share code, notes, and snippets.

@sug0
Last active February 16, 2022 09:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sug0/b5eb2c58be74f7cda230b8c1e1994670 to your computer and use it in GitHub Desktop.
Save sug0/b5eb2c58be74f7cda230b8c1e1994670 to your computer and use it in GitHub Desktop.
Constant function sin table in Rust
#![feature(const_fn)]
#![feature(const_raw_ptr_deref)]
fn main() {
const SIN_90: f32 = SINTAB[90];
println!("{}", SIN_90);
}
const fn to_radians(x: f64) -> f64 {
x * (std::f64::consts::PI / 180.0)
}
// https://www.gamedev.net/forums/topic/621589-extremely-fast-sin-approximation/
const fn fast_sin(mut x: f64) -> f64 {
let (mut y, mut z) = (x, x);
z *= 0.3183098861837907;
z += 6755399441055744.0;
let mut k = unsafe {
let p: *const i32 = &z as *const _ as *const _;
*p
};
z = k as f64;
z *= 3.1415926535897932;
x -= z;
y *= x;
z = 0.0073524681968701;
z *= y;
z -= 0.1652891139701474;
z *= y;
z += 0.9996919862959676;
x *= z;
k &= 1;
k += k;
z = k as f64;
z *= x;
x -= z;
x
}
const SINTAB: [f32; 360] = [
fast_sin(to_radians(0.0)) as f32,
fast_sin(to_radians(1.0)) as f32,
fast_sin(to_radians(2.0)) as f32,
fast_sin(to_radians(3.0)) as f32,
fast_sin(to_radians(4.0)) as f32,
fast_sin(to_radians(5.0)) as f32,
fast_sin(to_radians(6.0)) as f32,
fast_sin(to_radians(7.0)) as f32,
fast_sin(to_radians(8.0)) as f32,
fast_sin(to_radians(9.0)) as f32,
fast_sin(to_radians(10.0)) as f32,
fast_sin(to_radians(11.0)) as f32,
fast_sin(to_radians(12.0)) as f32,
fast_sin(to_radians(13.0)) as f32,
fast_sin(to_radians(14.0)) as f32,
fast_sin(to_radians(15.0)) as f32,
fast_sin(to_radians(16.0)) as f32,
fast_sin(to_radians(17.0)) as f32,
fast_sin(to_radians(18.0)) as f32,
fast_sin(to_radians(19.0)) as f32,
fast_sin(to_radians(20.0)) as f32,
fast_sin(to_radians(21.0)) as f32,
fast_sin(to_radians(22.0)) as f32,
fast_sin(to_radians(23.0)) as f32,
fast_sin(to_radians(24.0)) as f32,
fast_sin(to_radians(25.0)) as f32,
fast_sin(to_radians(26.0)) as f32,
fast_sin(to_radians(27.0)) as f32,
fast_sin(to_radians(28.0)) as f32,
fast_sin(to_radians(29.0)) as f32,
fast_sin(to_radians(30.0)) as f32,
fast_sin(to_radians(31.0)) as f32,
fast_sin(to_radians(32.0)) as f32,
fast_sin(to_radians(33.0)) as f32,
fast_sin(to_radians(34.0)) as f32,
fast_sin(to_radians(35.0)) as f32,
fast_sin(to_radians(36.0)) as f32,
fast_sin(to_radians(37.0)) as f32,
fast_sin(to_radians(38.0)) as f32,
fast_sin(to_radians(39.0)) as f32,
fast_sin(to_radians(40.0)) as f32,
fast_sin(to_radians(41.0)) as f32,
fast_sin(to_radians(42.0)) as f32,
fast_sin(to_radians(43.0)) as f32,
fast_sin(to_radians(44.0)) as f32,
fast_sin(to_radians(45.0)) as f32,
fast_sin(to_radians(46.0)) as f32,
fast_sin(to_radians(47.0)) as f32,
fast_sin(to_radians(48.0)) as f32,
fast_sin(to_radians(49.0)) as f32,
fast_sin(to_radians(50.0)) as f32,
fast_sin(to_radians(51.0)) as f32,
fast_sin(to_radians(52.0)) as f32,
fast_sin(to_radians(53.0)) as f32,
fast_sin(to_radians(54.0)) as f32,
fast_sin(to_radians(55.0)) as f32,
fast_sin(to_radians(56.0)) as f32,
fast_sin(to_radians(57.0)) as f32,
fast_sin(to_radians(58.0)) as f32,
fast_sin(to_radians(59.0)) as f32,
fast_sin(to_radians(60.0)) as f32,
fast_sin(to_radians(61.0)) as f32,
fast_sin(to_radians(62.0)) as f32,
fast_sin(to_radians(63.0)) as f32,
fast_sin(to_radians(64.0)) as f32,
fast_sin(to_radians(65.0)) as f32,
fast_sin(to_radians(66.0)) as f32,
fast_sin(to_radians(67.0)) as f32,
fast_sin(to_radians(68.0)) as f32,
fast_sin(to_radians(69.0)) as f32,
fast_sin(to_radians(70.0)) as f32,
fast_sin(to_radians(71.0)) as f32,
fast_sin(to_radians(72.0)) as f32,
fast_sin(to_radians(73.0)) as f32,
fast_sin(to_radians(74.0)) as f32,
fast_sin(to_radians(75.0)) as f32,
fast_sin(to_radians(76.0)) as f32,
fast_sin(to_radians(77.0)) as f32,
fast_sin(to_radians(78.0)) as f32,
fast_sin(to_radians(79.0)) as f32,
fast_sin(to_radians(80.0)) as f32,
fast_sin(to_radians(81.0)) as f32,
fast_sin(to_radians(82.0)) as f32,
fast_sin(to_radians(83.0)) as f32,
fast_sin(to_radians(84.0)) as f32,
fast_sin(to_radians(85.0)) as f32,
fast_sin(to_radians(86.0)) as f32,
fast_sin(to_radians(87.0)) as f32,
fast_sin(to_radians(88.0)) as f32,
fast_sin(to_radians(89.0)) as f32,
fast_sin(to_radians(90.0)) as f32,
fast_sin(to_radians(91.0)) as f32,
fast_sin(to_radians(92.0)) as f32,
fast_sin(to_radians(93.0)) as f32,
fast_sin(to_radians(94.0)) as f32,
fast_sin(to_radians(95.0)) as f32,
fast_sin(to_radians(96.0)) as f32,
fast_sin(to_radians(97.0)) as f32,
fast_sin(to_radians(98.0)) as f32,
fast_sin(to_radians(99.0)) as f32,
fast_sin(to_radians(100.0)) as f32,
fast_sin(to_radians(101.0)) as f32,
fast_sin(to_radians(102.0)) as f32,
fast_sin(to_radians(103.0)) as f32,
fast_sin(to_radians(104.0)) as f32,
fast_sin(to_radians(105.0)) as f32,
fast_sin(to_radians(106.0)) as f32,
fast_sin(to_radians(107.0)) as f32,
fast_sin(to_radians(108.0)) as f32,
fast_sin(to_radians(109.0)) as f32,
fast_sin(to_radians(110.0)) as f32,
fast_sin(to_radians(111.0)) as f32,
fast_sin(to_radians(112.0)) as f32,
fast_sin(to_radians(113.0)) as f32,
fast_sin(to_radians(114.0)) as f32,
fast_sin(to_radians(115.0)) as f32,
fast_sin(to_radians(116.0)) as f32,
fast_sin(to_radians(117.0)) as f32,
fast_sin(to_radians(118.0)) as f32,
fast_sin(to_radians(119.0)) as f32,
fast_sin(to_radians(120.0)) as f32,
fast_sin(to_radians(121.0)) as f32,
fast_sin(to_radians(122.0)) as f32,
fast_sin(to_radians(123.0)) as f32,
fast_sin(to_radians(124.0)) as f32,
fast_sin(to_radians(125.0)) as f32,
fast_sin(to_radians(126.0)) as f32,
fast_sin(to_radians(127.0)) as f32,
fast_sin(to_radians(128.0)) as f32,
fast_sin(to_radians(129.0)) as f32,
fast_sin(to_radians(130.0)) as f32,
fast_sin(to_radians(131.0)) as f32,
fast_sin(to_radians(132.0)) as f32,
fast_sin(to_radians(133.0)) as f32,
fast_sin(to_radians(134.0)) as f32,
fast_sin(to_radians(135.0)) as f32,
fast_sin(to_radians(136.0)) as f32,
fast_sin(to_radians(137.0)) as f32,
fast_sin(to_radians(138.0)) as f32,
fast_sin(to_radians(139.0)) as f32,
fast_sin(to_radians(140.0)) as f32,
fast_sin(to_radians(141.0)) as f32,
fast_sin(to_radians(142.0)) as f32,
fast_sin(to_radians(143.0)) as f32,
fast_sin(to_radians(144.0)) as f32,
fast_sin(to_radians(145.0)) as f32,
fast_sin(to_radians(146.0)) as f32,
fast_sin(to_radians(147.0)) as f32,
fast_sin(to_radians(148.0)) as f32,
fast_sin(to_radians(149.0)) as f32,
fast_sin(to_radians(150.0)) as f32,
fast_sin(to_radians(151.0)) as f32,
fast_sin(to_radians(152.0)) as f32,
fast_sin(to_radians(153.0)) as f32,
fast_sin(to_radians(154.0)) as f32,
fast_sin(to_radians(155.0)) as f32,
fast_sin(to_radians(156.0)) as f32,
fast_sin(to_radians(157.0)) as f32,
fast_sin(to_radians(158.0)) as f32,
fast_sin(to_radians(159.0)) as f32,
fast_sin(to_radians(160.0)) as f32,
fast_sin(to_radians(161.0)) as f32,
fast_sin(to_radians(162.0)) as f32,
fast_sin(to_radians(163.0)) as f32,
fast_sin(to_radians(164.0)) as f32,
fast_sin(to_radians(165.0)) as f32,
fast_sin(to_radians(166.0)) as f32,
fast_sin(to_radians(167.0)) as f32,
fast_sin(to_radians(168.0)) as f32,
fast_sin(to_radians(169.0)) as f32,
fast_sin(to_radians(170.0)) as f32,
fast_sin(to_radians(171.0)) as f32,
fast_sin(to_radians(172.0)) as f32,
fast_sin(to_radians(173.0)) as f32,
fast_sin(to_radians(174.0)) as f32,
fast_sin(to_radians(175.0)) as f32,
fast_sin(to_radians(176.0)) as f32,
fast_sin(to_radians(177.0)) as f32,
fast_sin(to_radians(178.0)) as f32,
fast_sin(to_radians(179.0)) as f32,
fast_sin(to_radians(180.0)) as f32,
fast_sin(to_radians(181.0)) as f32,
fast_sin(to_radians(182.0)) as f32,
fast_sin(to_radians(183.0)) as f32,
fast_sin(to_radians(184.0)) as f32,
fast_sin(to_radians(185.0)) as f32,
fast_sin(to_radians(186.0)) as f32,
fast_sin(to_radians(187.0)) as f32,
fast_sin(to_radians(188.0)) as f32,
fast_sin(to_radians(189.0)) as f32,
fast_sin(to_radians(190.0)) as f32,
fast_sin(to_radians(191.0)) as f32,
fast_sin(to_radians(192.0)) as f32,
fast_sin(to_radians(193.0)) as f32,
fast_sin(to_radians(194.0)) as f32,
fast_sin(to_radians(195.0)) as f32,
fast_sin(to_radians(196.0)) as f32,
fast_sin(to_radians(197.0)) as f32,
fast_sin(to_radians(198.0)) as f32,
fast_sin(to_radians(199.0)) as f32,
fast_sin(to_radians(200.0)) as f32,
fast_sin(to_radians(201.0)) as f32,
fast_sin(to_radians(202.0)) as f32,
fast_sin(to_radians(203.0)) as f32,
fast_sin(to_radians(204.0)) as f32,
fast_sin(to_radians(205.0)) as f32,
fast_sin(to_radians(206.0)) as f32,
fast_sin(to_radians(207.0)) as f32,
fast_sin(to_radians(208.0)) as f32,
fast_sin(to_radians(209.0)) as f32,
fast_sin(to_radians(210.0)) as f32,
fast_sin(to_radians(211.0)) as f32,
fast_sin(to_radians(212.0)) as f32,
fast_sin(to_radians(213.0)) as f32,
fast_sin(to_radians(214.0)) as f32,
fast_sin(to_radians(215.0)) as f32,
fast_sin(to_radians(216.0)) as f32,
fast_sin(to_radians(217.0)) as f32,
fast_sin(to_radians(218.0)) as f32,
fast_sin(to_radians(219.0)) as f32,
fast_sin(to_radians(220.0)) as f32,
fast_sin(to_radians(221.0)) as f32,
fast_sin(to_radians(222.0)) as f32,
fast_sin(to_radians(223.0)) as f32,
fast_sin(to_radians(224.0)) as f32,
fast_sin(to_radians(225.0)) as f32,
fast_sin(to_radians(226.0)) as f32,
fast_sin(to_radians(227.0)) as f32,
fast_sin(to_radians(228.0)) as f32,
fast_sin(to_radians(229.0)) as f32,
fast_sin(to_radians(230.0)) as f32,
fast_sin(to_radians(231.0)) as f32,
fast_sin(to_radians(232.0)) as f32,
fast_sin(to_radians(233.0)) as f32,
fast_sin(to_radians(234.0)) as f32,
fast_sin(to_radians(235.0)) as f32,
fast_sin(to_radians(236.0)) as f32,
fast_sin(to_radians(237.0)) as f32,
fast_sin(to_radians(238.0)) as f32,
fast_sin(to_radians(239.0)) as f32,
fast_sin(to_radians(240.0)) as f32,
fast_sin(to_radians(241.0)) as f32,
fast_sin(to_radians(242.0)) as f32,
fast_sin(to_radians(243.0)) as f32,
fast_sin(to_radians(244.0)) as f32,
fast_sin(to_radians(245.0)) as f32,
fast_sin(to_radians(246.0)) as f32,
fast_sin(to_radians(247.0)) as f32,
fast_sin(to_radians(248.0)) as f32,
fast_sin(to_radians(249.0)) as f32,
fast_sin(to_radians(250.0)) as f32,
fast_sin(to_radians(251.0)) as f32,
fast_sin(to_radians(252.0)) as f32,
fast_sin(to_radians(253.0)) as f32,
fast_sin(to_radians(254.0)) as f32,
fast_sin(to_radians(255.0)) as f32,
fast_sin(to_radians(256.0)) as f32,
fast_sin(to_radians(257.0)) as f32,
fast_sin(to_radians(258.0)) as f32,
fast_sin(to_radians(259.0)) as f32,
fast_sin(to_radians(260.0)) as f32,
fast_sin(to_radians(261.0)) as f32,
fast_sin(to_radians(262.0)) as f32,
fast_sin(to_radians(263.0)) as f32,
fast_sin(to_radians(264.0)) as f32,
fast_sin(to_radians(265.0)) as f32,
fast_sin(to_radians(266.0)) as f32,
fast_sin(to_radians(267.0)) as f32,
fast_sin(to_radians(268.0)) as f32,
fast_sin(to_radians(269.0)) as f32,
fast_sin(to_radians(270.0)) as f32,
fast_sin(to_radians(271.0)) as f32,
fast_sin(to_radians(272.0)) as f32,
fast_sin(to_radians(273.0)) as f32,
fast_sin(to_radians(274.0)) as f32,
fast_sin(to_radians(275.0)) as f32,
fast_sin(to_radians(276.0)) as f32,
fast_sin(to_radians(277.0)) as f32,
fast_sin(to_radians(278.0)) as f32,
fast_sin(to_radians(279.0)) as f32,
fast_sin(to_radians(280.0)) as f32,
fast_sin(to_radians(281.0)) as f32,
fast_sin(to_radians(282.0)) as f32,
fast_sin(to_radians(283.0)) as f32,
fast_sin(to_radians(284.0)) as f32,
fast_sin(to_radians(285.0)) as f32,
fast_sin(to_radians(286.0)) as f32,
fast_sin(to_radians(287.0)) as f32,
fast_sin(to_radians(288.0)) as f32,
fast_sin(to_radians(289.0)) as f32,
fast_sin(to_radians(290.0)) as f32,
fast_sin(to_radians(291.0)) as f32,
fast_sin(to_radians(292.0)) as f32,
fast_sin(to_radians(293.0)) as f32,
fast_sin(to_radians(294.0)) as f32,
fast_sin(to_radians(295.0)) as f32,
fast_sin(to_radians(296.0)) as f32,
fast_sin(to_radians(297.0)) as f32,
fast_sin(to_radians(298.0)) as f32,
fast_sin(to_radians(299.0)) as f32,
fast_sin(to_radians(300.0)) as f32,
fast_sin(to_radians(301.0)) as f32,
fast_sin(to_radians(302.0)) as f32,
fast_sin(to_radians(303.0)) as f32,
fast_sin(to_radians(304.0)) as f32,
fast_sin(to_radians(305.0)) as f32,
fast_sin(to_radians(306.0)) as f32,
fast_sin(to_radians(307.0)) as f32,
fast_sin(to_radians(308.0)) as f32,
fast_sin(to_radians(309.0)) as f32,
fast_sin(to_radians(310.0)) as f32,
fast_sin(to_radians(311.0)) as f32,
fast_sin(to_radians(312.0)) as f32,
fast_sin(to_radians(313.0)) as f32,
fast_sin(to_radians(314.0)) as f32,
fast_sin(to_radians(315.0)) as f32,
fast_sin(to_radians(316.0)) as f32,
fast_sin(to_radians(317.0)) as f32,
fast_sin(to_radians(318.0)) as f32,
fast_sin(to_radians(319.0)) as f32,
fast_sin(to_radians(320.0)) as f32,
fast_sin(to_radians(321.0)) as f32,
fast_sin(to_radians(322.0)) as f32,
fast_sin(to_radians(323.0)) as f32,
fast_sin(to_radians(324.0)) as f32,
fast_sin(to_radians(325.0)) as f32,
fast_sin(to_radians(326.0)) as f32,
fast_sin(to_radians(327.0)) as f32,
fast_sin(to_radians(328.0)) as f32,
fast_sin(to_radians(329.0)) as f32,
fast_sin(to_radians(330.0)) as f32,
fast_sin(to_radians(331.0)) as f32,
fast_sin(to_radians(332.0)) as f32,
fast_sin(to_radians(333.0)) as f32,
fast_sin(to_radians(334.0)) as f32,
fast_sin(to_radians(335.0)) as f32,
fast_sin(to_radians(336.0)) as f32,
fast_sin(to_radians(337.0)) as f32,
fast_sin(to_radians(338.0)) as f32,
fast_sin(to_radians(339.0)) as f32,
fast_sin(to_radians(340.0)) as f32,
fast_sin(to_radians(341.0)) as f32,
fast_sin(to_radians(342.0)) as f32,
fast_sin(to_radians(343.0)) as f32,
fast_sin(to_radians(344.0)) as f32,
fast_sin(to_radians(345.0)) as f32,
fast_sin(to_radians(346.0)) as f32,
fast_sin(to_radians(347.0)) as f32,
fast_sin(to_radians(348.0)) as f32,
fast_sin(to_radians(349.0)) as f32,
fast_sin(to_radians(350.0)) as f32,
fast_sin(to_radians(351.0)) as f32,
fast_sin(to_radians(352.0)) as f32,
fast_sin(to_radians(353.0)) as f32,
fast_sin(to_radians(354.0)) as f32,
fast_sin(to_radians(355.0)) as f32,
fast_sin(to_radians(356.0)) as f32,
fast_sin(to_radians(357.0)) as f32,
fast_sin(to_radians(358.0)) as f32,
fast_sin(to_radians(359.0)) as f32,
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment