Changeset e9d0ed4 in mainline for uspace/app/tester/float/softfloat1.c


Ignore:
Timestamp:
2012-10-07T09:56:15Z (12 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
000494d
Parents:
b60faf7
Message:

Add single precision float tests for multiplication and division.
Currently, division fails for two test cases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/tester/float/softfloat1.c

    rb60faf7 re9d0ed4  
    3232#include <add.h>
    3333#include <sub.h>
     34#include <mul.h>
     35#include <div.h>
    3436#include <bool.h>
    3537#include "../tester.h"
    3638
    37 #define OPERANDS   5
     39#define OPERANDS  6
    3840#define PRECISION  10000
    3941
     
    4345
    4446static float float_op_a[OPERANDS] =
    45         {3.5, -2.1, 100.0, 50.0, -1024.0};
     47        {3.5, -2.1, 100.0, 50.0, -1024.0, 0.0};
    4648
    4749static float float_op_b[OPERANDS] =
    48         {-2.1, 100.0, 50.0, -1024.0, 3.5};
     50        {-2.1, 100.0, 50.0, -1024.0, 3.5, 0.0};
    4951
    5052static cmptype_t cmpabs(cmptype_t a)
     
    9698}
    9799
     100static bool test_float_mul(void)
     101{
     102        bool correct = true;
     103       
     104        for (unsigned int i = 0; i < OPERANDS; i++) {
     105                for (unsigned int j = 0; j < OPERANDS; j++) {
     106                        float a = float_op_a[i];
     107                        float b = float_op_b[j];
     108                        float c = a * b;
     109                       
     110                        float_t sa;
     111                        float_t sb;
     112                        float_t sc;
     113                       
     114                        sa.val = float_op_a[i];
     115                        sb.val = float_op_b[j];
     116                        sc.data = mul_float(sa.data, sb.data);
     117                               
     118                        cmptype_t ic = (cmptype_t) (c * PRECISION);
     119                        cmptype_t isc = (cmptype_t) (sc.val * PRECISION);
     120                        cmptype_t diff = cmpabs(ic - isc);
     121                       
     122                        if (diff != 0) {
     123                                TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", i, j, diff);
     124                                correct = false;
     125                        }
     126                }
     127        }
     128       
     129        return correct;
     130}
     131
     132static bool test_float_div(void)
     133{
     134        bool correct = true;
     135       
     136        for (unsigned int i = 0; i < OPERANDS; i++) {
     137                for (unsigned int j = 0; j < OPERANDS; j++) {
     138                        float a = float_op_a[i];
     139                        float b = float_op_b[j];
     140
     141                        if (b == 0.0)
     142                                continue;
     143
     144                        float c = a / b;
     145                       
     146                        float_t sa;
     147                        float_t sb;
     148                        float_t sc;
     149                       
     150                        sa.val = float_op_a[i];
     151                        sb.val = float_op_b[j];
     152                        sc.data = div_float(sa.data, sb.data);
     153                               
     154                        cmptype_t ic = (cmptype_t) (c * PRECISION);
     155                        cmptype_t isc = (cmptype_t) (sc.val * PRECISION);
     156                        cmptype_t diff = cmpabs(ic - isc);
     157                       
     158                        if (diff != 0) {
     159                                TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", i, j, diff);
     160                                correct = false;
     161                        }
     162                }
     163        }
     164       
     165        return correct;
     166}
     167
    98168const char *test_softfloat1(void)
    99169{
    100170        if (!test_float_add())
    101171                return "Float addition failed";
     172        if (!test_float_mul())
     173                return "Float multiplication failed";
     174        if (!test_float_div())
     175                return "Float division failed";
    102176       
    103177        return NULL;
Note: See TracChangeset for help on using the changeset viewer.