public static BenchmarkResult BenchmarkBinaryOperation(BinaryOp op) { // \todo [petri] use all generators? F64[] inputs0 = op.inputGenerators[0].Item1(rnd, BENCHMARK_CHUNK_SIZE).Select(d => F64.FromDouble(d)).ToArray(); F64[] inputs1 = op.inputGenerators[0].Item2(rnd, BENCHMARK_CHUNK_SIZE).Select(d => F64.FromDouble(d)).ToArray(); F64[] outputs = new F64[BENCHMARK_CHUNK_SIZE]; // Measure execution time. double elapsedSeconds = BenchmarkFunction(() => { for (int iter = 0; iter < op.numBenchmarkIters; iter++) { op.arrayExecute(BENCHMARK_CHUNK_SIZE, inputs0, inputs1, outputs); } }); // Return reuslt. long numTotalOps = op.numBenchmarkIters * BENCHMARK_CHUNK_SIZE; double opsPerSec = numTotalOps / elapsedSeconds; return(new BenchmarkResult(opsPerSec, elapsedSeconds)); }
/// <inheritdoc /> public override string ToString() => $"F ({F64.ToString(CultureInfo.InvariantCulture)})";
public static PrecisionResult TestBinaryPrecision(BinaryOp op) { int numTested = 0; double totalErr = 0.0; double maxErr = 0.0; Tuple <F64, F64> worstInput = Tuple.Create(F64.Zero, F64.Zero); foreach (BinaryInputGenerator inputGenerator in op.inputGenerators) { F64[] inputs0 = inputGenerator.Item1(rnd, NUM_PRECISION_TESTS).Select(d => F64.FromDouble(d)).ToArray(); F64[] inputs1 = inputGenerator.Item2(rnd, NUM_PRECISION_TESTS).Select(d => F64.FromDouble(d)).ToArray(); F64[] outputs = new F64[NUM_PRECISION_TESTS]; op.arrayExecute(NUM_PRECISION_TESTS, inputs0, inputs1, outputs); for (int i = 0; i < NUM_PRECISION_TESTS; i++) { double input0 = inputs0[i].Double; double input1 = inputs1[i].Double; double res = outputs[i].Double; double reference = op.refExecute(input0, input1); if (reference >= ValueBounds.NegMax && reference <= ValueBounds.PosMax) { double err = op.evaluateError(inputs0[i], inputs1[i], outputs[i], reference); numTested++; totalErr += err; if (err >= maxErr) { maxErr = Math.Max(maxErr, err); worstInput = Tuple.Create(inputs0[i], inputs1[i]); } } } } Debug.Assert(numTested > 1000); double avgErr = totalErr / (double)numTested; double numBits = -Math.Log(maxErr, 2.0); return(new PrecisionResult(avgErr, maxErr, numBits, new[] { worstInput.Item1, worstInput.Item2 })); }
public void SetTurnSpeed(F64 turnSpeed) { moveData.turnSpeed = turnSpeed; }
public void SetSpeed(F64 speed) { moveData.speed = speed; }
static F64Vec3 F64Vec3Ratio100(int x, int y, int z) { return(new F64Vec3(F64.Ratio100(x), F64.Ratio100(y), F64.Ratio100(z))); }
void TestTurn() { Debug.LogError(new F64(1.3d) + new F64(0.1d)); Debug.LogError(new F64(0d)); MoveObject obj = new MoveObject(); obj.SetPos(F64Vec3.Zero); obj.SetDir(new F64Vec3(0, 0, 1)); obj.moveData.detectionLen = new F64(5); obj.moveData.detectionWidth = new F64(0.8); GameObjectGetter tankGetter = ResHelper.LoadGameObject("prefabs/tank"); GameObject tankGo = tankGetter.Get(); tankGo.transform.position = obj.GetPos().ToUnityVector3(); tankGo.transform.forward = obj.GetDir().ToUnityVector3(); GameObject.Instantiate <GameObject>(tankGo); for (int i = 0; i < 3; i++) { F64Vec3 newDir = F64Vec3.RotateY(obj.GetDir(), new F64(30)); obj.SetDir(F64Vec3.Normalize(newDir)); obj.SetPos(obj.GetPos() + (newDir * new F64(5))); tankGo.transform.position = obj.GetPos().ToUnityVector3(); tankGo.transform.forward = obj.GetDir().ToUnityVector3(); GameObject.Instantiate <GameObject>(tankGo); } Vector3 av = new Vector3(100, 0, 20); F64Vec3 localAv = F64Vec3.PointToLocalSpace2D(F64Vec3.FromUnityVector3(av), obj.forward, obj.left, obj.GetPos()); Debug.LogError("world obj=" + obj.GetPos().ToUnityVector3() + "world av=" + av + "loc av " + localAv.ToUnityVector3()); F64Matrix3x3 m = new F64Matrix3x3(); //F64Vec2 localAv2 = localAv.ToF64Vec2(); //F64Vec2 forward2 = obj.forward.ToF64Vec2(); //F64Vec2 left2 = obj.left.ToF64Vec2(); F64Vec2 localAv2 = F64Vec2.FromFloat(88.2f, 13.2f); F64Vec2 forward2 = F64Vec2.FromFloat(1f, 0f); F64Vec2 left2 = F64Vec2.FromFloat(0f, 1f); F64Vec2 worldAv2 = m.VectorToWorldSpace(localAv2, forward2, left2); F64Vec3 worldAv3 = F64Vec3.FromF64Vec2(worldAv2); Debug.LogError("m convt to world " + worldAv3.ToUnityVector3() + " " + worldAv3); GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Sphere); F64 radius = F64.Half; F64 foffsetX = F64.One; F64 foffsetZ = obj.moveData.detectionWidth + radius + new F64(-0.1); F64Vec3 fcubePos = new F64Vec3(obj.GetPos().X + foffsetX, obj.GetPos().Y, obj.GetPos().Z + foffsetZ); cube.transform.position = fcubePos.ToUnityVector3(); F64Vec3 flocalCube = F64Vec3.PointToLocalSpace2D(fcubePos, obj.forward, obj.left, obj.GetPos()); Debug.LogError("world obj=" + obj.GetPos().ToUnityVector3() + "world cube=" + fcubePos + "loc cubePos " + flocalCube.ToUnityVector3()); Debug.LogError("world obj=" + obj.GetPos().ToUnityVector3() + "world cube=" + fcubePos + "loc cubePos " + flocalCube); fff(obj, fcubePos, F64.Half); //Mathf.Approximately() }