示例#1
0
        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));
        }
示例#2
0
文件: FValue.cs 项目: mirec12590/Echo
 /// <inheritdoc />
 public override string ToString() => $"F ({F64.ToString(CultureInfo.InvariantCulture)})";
示例#3
0
        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 }));
        }
示例#4
0
 public void SetTurnSpeed(F64 turnSpeed)
 {
     moveData.turnSpeed = turnSpeed;
 }
示例#5
0
 public void SetSpeed(F64 speed)
 {
     moveData.speed = speed;
 }
示例#6
0
 static F64Vec3 F64Vec3Ratio100(int x, int y, int z)
 {
     return(new F64Vec3(F64.Ratio100(x), F64.Ratio100(y), F64.Ratio100(z)));
 }
示例#7
0
    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()
    }