diff fptest.c @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children f3407a58e01e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fptest.c	Fri Sep 28 01:54:23 2012 +0300
@@ -0,0 +1,99 @@
+#include "dmlib.h"
+#include <stdio.h>
+
+#define FP_DW_SIZE 8
+#define FP_W0_SIZE 4
+
+void check(const char *str, DMFixedPoint v, Uint64 dw)
+{
+    DMFixedPoint *q = (DMFixedPoint *) &dw;
+
+    printf("%-15s = ", str); FP_PRINTF(v); printf("\n");
+    printf("should be       = "); FP_PRINTF((*q)); printf("\n");
+
+    if (v.dw != dw)
+    {
+        printf("ERROR! A test value differs from expected!\n");
+        exit(1);
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    int i;
+    DMFixedPoint a, b, delta;
+    char *s;
+
+    (void) argc;
+    (void) argv;
+
+    // Check host characteristics
+    switch (SDL_BYTEORDER)
+    {
+        case SDL_BIG_ENDIAN: s = "big endian"; break;
+        case SDL_LIL_ENDIAN: s = "little endian"; break;
+        default: s = "unknown?"; break;
+    }
+    
+    printf(
+    "SDL byte order            = %s (%d)\n\n", s, SDL_BYTEORDER);
+    
+    printf(
+    "sizeof(DMFixedPoint)      = %d bytes\n"
+    "sizeof(DMFixedPoint.dw    = %d bytes (should be %d)\n"
+    "sizeof(DMFixedPoint.w[0]  = %d bytes (should be %d)\n",
+    sizeof(a), sizeof(a.dw), FP_DW_SIZE,
+    sizeof(a.w[0]), FP_W0_SIZE);
+    
+    if (sizeof(a.dw) != FP_DW_SIZE || sizeof(a.w[0]) != FP_W0_SIZE)
+    {
+        printf("ERROR! Some type sizes DO NOT MATCH!\n");
+        return -1;
+    }
+    
+    // TEST #1
+    printf("\nTEST #1: set initial values\n");
+    FP_SETHL(a, 55, 0);
+    check("a", a, 0x0000003700000000ULL);
+
+    FP_CONV(b, 178);
+    check("b", b, 0x00000000000000b2ULL);
+
+    FP_DIV_R(delta, a, b);
+    check("delta", delta, 0x000000004f19e33cULL);
+
+    // Test #2
+    printf("\nTEST #2: 50 x (a + delta)\n");
+    for (i = 0; i < 50; i++)
+    {
+        FP_ADD(a, delta);
+    }
+    check("a end", a, 0x00000046730e61b8ULL);
+
+
+    // Test #3
+    printf("\nTEST #3: 50 x (a - delta)\n");
+    for (i = 0; i < 50; i++)
+    {
+        FP_SUB(a, delta);
+    }
+    check("a end", a, 0x0000003700000000ULL);
+
+    // Test #4
+    printf("\nTEST #4: 5 x (a * delta)\n");
+    for (i = 0; i < 5; i++)
+    {
+        FP_MUL(a, delta);
+    }
+    check("a end", a, 0xd644e40000000000ULL);
+
+    // Test #5
+    printf("\nTEST #4: 2 x (a / delta)\n");
+    for (i = 0; i < 2; i++)
+    {
+        FP_DIV(a, delta);
+    }
+    check("a end", a, 8ULL);
+
+    return 0;
+}