{"ScriptPreparationCode":"var N = 1000000;\r\nvar xs = new Float32Array(N);\r\nvar ys = new Float32Array(N);\r\nvar zs = new Float32Array(N);\r\nvar cos_thetas = new Float32Array(N);\r\n\r\nfor (var i = 0; i \u003C N; \u002B\u002Bi) {\r\n const x = 2 * Math.random() - 1;\r\n const y = 2 * Math.random() - 1;\r\n const z = 2 * Math.random() - 1;\r\n const mag = Math.sqrt(x * x \u002B y * y \u002B z * z);\r\n xs[i] = x / mag;\r\n ys[i] = y / mag;\r\n zs[i] = z / mag;\r\n}\r\n\r\nfor (var i = 0; i \u003C N; \u002B\u002Bi) {\r\n\tcos_thetas[i] = Math.cos(2 * Math.PI * Math.random());\r\n}","TestCases":[{"Name":"Math.acos, cos, sin","Code":"function quat_from_axis_angle(axis_x, axis_y, axis_z, cos_angle) {\r\n const angle = Math.acos(cos_angle)\r\n const cos_half_angle = Math.cos(angle / 2)\r\n const sin_half_angle = Math.sin(angle / 2)\r\n return {\r\n a: cos_half_angle,\r\n b: sin_half_angle * axis_x,\r\n c: sin_half_angle * axis_y,\r\n d: sin_half_angle * axis_z,\r\n }\r\n}\r\n\r\nfor (var i = 0; i \u003C N; \u002B\u002Bi) { quat_from_axis_angle(xs[i], ys[i], zs[i], cos_thetas[i]); }","IsDeferred":false},{"Name":"Math.acos, cos, sqrt","Code":"function quat_from_axis_angle(axis_x, axis_y, axis_z, cos_angle) {\r\n const angle = Math.acos(cos_angle)\r\n const cos_half_angle = Math.cos(angle / 2)\r\n const sin_half_angle = Math.sqrt(1 - cos_angle * cos_angle)\r\n return {\r\n a: cos_half_angle,\r\n b: sin_half_angle * axis_x,\r\n c: sin_half_angle * axis_y,\r\n d: sin_half_angle * axis_z,\r\n }\r\n}\r\n\r\nfor (var i = 0; i \u003C N; \u002B\u002Bi) { quat_from_axis_angle(xs[i], ys[i], zs[i], cos_thetas[i]); }","IsDeferred":false},{"Name":"Half-angle identity","Code":"function quat_from_axis_angle(axis_x, axis_y, axis_z, cos_angle) {\r\n const cos_half_angle = Math.sqrt((1 \u002B cos_angle) / 2)\r\n const sin_half_angle = Math.sqrt((1 - cos_angle) / 2)\r\n return {\r\n a: cos_half_angle,\r\n b: sin_half_angle * axis_x,\r\n c: sin_half_angle * axis_y,\r\n d: sin_half_angle * axis_z,\r\n }\r\n}\r\n\r\nfor (var i = 0; i \u003C N; \u002B\u002Bi) { quat_from_axis_angle(xs[i], ys[i], zs[i], cos_thetas[i]); }","IsDeferred":false}]}