Changeset c0c38c7c in mainline for uspace/lib/math


Ignore:
Timestamp:
2015-03-14T21:36:44Z (10 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7f9d97f3
Parents:
2c7fdaa
Message:

software floating point overhaul
use proper type mapping
fix cosine calculation

Location:
uspace/lib/math
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/math/arch/abs32le/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/amd64/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    3636#define LIBMATH_amd64_MATH_H_
    3737
     38#include <mathtypes.h>
    3839#include <mod.h>
    3940
    40 static inline double fmod(double dividend, double divisor)
     41static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4142{
    42         return double_mod(dividend, divisor);
     43        return float64_mod(dividend, divisor);
    4344}
    4445
    45 extern double sin(double);
    46 extern double cos(double);
    47 extern double trunc(double);
     46extern float64_t sin(float64_t);
     47extern float64_t cos(float64_t);
     48extern float64_t trunc(float64_t);
    4849
    4950#endif
  • uspace/lib/math/arch/arm32/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/ia32/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    3636#define LIBMATH_ia32_MATH_H_
    3737
     38#include <mathtypes.h>
    3839#include <mod.h>
    3940
    40 static inline double fmod(double dividend, double divisor)
     41static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4142{
    42         return double_mod(dividend, divisor);
     43        return float64_mod(dividend, divisor);
    4344}
    4445
    45 extern double sin(double);
    46 extern double cos(double);
    47 extern double trunc(double);
     46extern float64_t sin(float64_t);
     47extern float64_t cos(float64_t);
     48extern float64_t trunc(float64_t);
    4849
    4950#endif
  • uspace/lib/math/arch/ia64/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/mips32/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/mips32eb/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/ppc32/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    4848static inline double trunc(double val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/sparc32/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/arch/sparc64/include/libarch/math.h

    r2c7fdaa rc0c38c7c  
    4141#include <trig.h>
    4242
    43 static inline double fmod(double dividend, double divisor)
     43static inline float64_t fmod(float64_t dividend, float64_t divisor)
    4444{
    45         return double_mod(dividend, divisor);
     45        return float64_mod(dividend, divisor);
    4646}
    4747
    48 static inline double trunc(double val)
     48static inline float64_t trunc(float64_t val)
    4949{
    50         double_t arg;
     50        float64_u arg;
    5151        arg.val = val;
    5252       
    53         double_t ret;
     53        float64_u ret;
    5454        ret.data = trunc_float64(arg.data);
    5555       
     
    5757}
    5858
    59 static inline double sin(double val)
     59static inline float64_t sin(float64_t val)
    6060{
    61         return double_sin(val);
     61        return float64_sin(val);
    6262}
    6363
    64 static inline double cos(double val)
     64static inline float64_t cos(float64_t val)
    6565{
    66         return double_cos(val);
     66        return float64_cos(val);
    6767}
    6868
  • uspace/lib/math/generic/mod.c

    r2c7fdaa rc0c38c7c  
    5252 *
    5353 */
    54 double double_mod(double dividend, double divisor)
     54float64_t float64_mod(float64_t dividend, float64_t divisor)
    5555{
    5656        // FIXME: replace with exact arithmetics
    5757       
    58         double quotient = trunc(dividend / divisor);
     58        float64_t quotient = trunc(dividend / divisor);
    5959       
    6060        return (dividend - quotient * divisor);
  • uspace/lib/math/generic/trig.c

    r2c7fdaa rc0c38c7c  
    3939
    4040/** Precomputed values for factorial (starting from 1!) */
    41 static double factorials[TAYLOR_DEGREE] = {
     41static float64_t factorials[TAYLOR_DEGREE] = {
    4242        1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800,
    4343        479001600, 6227020800
     
    5656 *
    5757 */
    58 static double taylor_sin(double arg)
    59 {
    60         double ret = 0;
    61         double nom = 1;
     58static float64_t taylor_sin(float64_t arg)
     59{
     60        float64_t ret = 0;
     61        float64_t nom = 1;
    6262       
    6363        for (unsigned int i = 0; i < TAYLOR_DEGREE; i++) {
     
    8585 *
    8686 */
    87 static double taylor_cos(double arg)
    88 {
    89         double ret = 1;
    90         double nom = 1;
     87static float64_t taylor_cos(float64_t arg)
     88{
     89        float64_t ret = 1;
     90        float64_t nom = 1;
    9191       
    9292        for (unsigned int i = 0; i < TAYLOR_DEGREE; i++) {
     
    114114 *
    115115 */
    116 static double base_sin(double arg)
     116static float64_t base_sin(float64_t arg)
    117117{
    118118        unsigned int period = arg / (M_PI / 4);
     
    147147 *
    148148 */
    149 static double base_cos(double arg)
     149static float64_t base_cos(float64_t arg)
    150150{
    151151        unsigned int period = arg / (M_PI / 4);
     
    156156        case 1:
    157157        case 2:
    158                 return taylor_sin(arg - M_PI / 2);
     158                return -taylor_sin(arg - M_PI / 2);
    159159        case 3:
    160160        case 4:
     
    162162        case 5:
    163163        case 6:
    164                 return -taylor_sin(arg - 3 * M_PI / 2);
     164                return taylor_sin(arg - 3 * M_PI / 2);
    165165        default:
    166166                return taylor_cos(arg - 2 * M_PI);
     
    177177 *
    178178 */
    179 double double_sin(double arg)
    180 {
    181         double base_arg = fmod(arg, 2 * M_PI);
     179float64_t float64_sin(float64_t arg)
     180{
     181        float64_t base_arg = fmod(arg, 2 * M_PI);
    182182       
    183183        if (base_arg < 0)
     
    196196 *
    197197 */
    198 double double_cos(double arg)
    199 {
    200         double base_arg = fmod(arg, 2 * M_PI);
     198float64_t float64_cos(float64_t arg)
     199{
     200        float64_t base_arg = fmod(arg, 2 * M_PI);
    201201       
    202202        if (base_arg < 0)
  • uspace/lib/math/include/mathtypes.h

    r2c7fdaa rc0c38c7c  
    191191#endif
    192192
    193 typedef union {
    194         float val;
    195        
     193
    196194#if defined(FLOAT_SIZE_32)
     195
     196#ifndef float32_t
     197        #define float32_t  float
     198#endif
     199
     200#elif defined(FLOAT_SIZE_64)
     201
     202#ifndef float64_t
     203        #define float64_t  float
     204#endif
     205
     206#elif defined(FLOAT_SIZE_96)
     207
     208#ifndef float96_t
     209        #define float96_t  float
     210#endif
     211
     212#elif defined(FLOAT_SIZE_128)
     213
     214#ifndef float128_t
     215        #define float128_t  float
     216#endif
     217
     218#endif
     219
     220
     221#if defined(DOUBLE_SIZE_32)
     222
     223#ifndef float32_t
     224        #define float32_t  double
     225#endif
     226
     227#elif defined(DOUBLE_SIZE_64)
     228
     229#ifndef float64_t
     230        #define float64_t  double
     231#endif
     232
     233#elif defined(DOUBLE_SIZE_96)
     234
     235#ifndef float96_t
     236        #define float96_t  double
     237#endif
     238
     239#elif defined(DOUBLE_SIZE_128)
     240
     241#ifndef float128_t
     242        #define float128_t  double
     243#endif
     244
     245#endif
     246
     247
     248#if defined(LONG_DOUBLE_SIZE_32)
     249
     250#ifndef float32_t
     251        #define float32_t  long double
     252#endif
     253
     254#elif defined(LONG_DOUBLE_SIZE_64)
     255
     256#ifndef float64_t
     257        #define float64_t  long double
     258#endif
     259
     260#elif defined(LONG_DOUBLE_SIZE_96)
     261
     262#ifndef float96_t
     263        #define float96_t  long double
     264#endif
     265
     266#elif defined(LONG_DOUBLE_SIZE_128)
     267
     268#ifndef float128_t
     269        #define float128_t  long double
     270#endif
     271
     272#endif
     273
     274
     275#ifdef float32_t
     276
     277typedef union {
     278        float32_t val;
    197279        float32 data;
    198 #elif defined(FLOAT_SIZE_64)
     280} float32_u;
     281
     282#endif
     283
     284#ifdef float64_t
     285
     286typedef union {
     287        float64_t val;
    199288        float64 data;
    200 #elif defined(FLOAT_SIZE_96)
     289} float64_u;
     290
     291#endif
     292
     293#ifdef float96_t
     294
     295typedef union {
     296        float96_t val;
    201297        float96 data;
    202 #elif defined(FLOAT_SIZE_128)
     298} float96_u;
     299
     300#endif
     301
     302#ifdef float128_t
     303
     304typedef union {
     305        float128_t val;
    203306        float128 data;
    204 #else
    205         #error Unsupported float size
    206 #endif
    207 } float_t;
    208 
    209 typedef union {
    210         double val;
    211        
    212 #if defined(DOUBLE_SIZE_32)
    213         float32 data;
    214 #elif defined(DOUBLE_SIZE_64)
    215         float64 data;
    216 #elif defined(DOUBLE_SIZE_96)
    217         float96 data;
    218 #elif defined(DOUBLE_SIZE_128)
    219         float128 data;
    220 #else
    221         #error Unsupported double size
    222 #endif
    223 } double_t;
    224 
    225 typedef union {
    226         long double val;
    227        
    228 #if defined(LONG_DOUBLE_SIZE_32)
    229         float32 data;
    230 #elif defined(LONG_DOUBLE_SIZE_64)
    231         float64 data;
    232 #elif defined(LONG_DOUBLE_SIZE_96)
    233         float96 data;
    234 #elif defined(LONG_DOUBLE_SIZE_128)
    235         float128 data;
    236 #else
    237         #error Unsupported long double size
    238 #endif
    239 } long_double_t;
     307} float128_u;
     308
     309#endif
    240310
    241311#endif
  • uspace/lib/math/include/mod.h

    r2c7fdaa rc0c38c7c  
    3636#define LIBMATH_MOD_H_
    3737
    38 extern double double_mod(double, double);
     38extern float64_t float64_mod(float64_t, float64_t);
    3939
    4040#endif
  • uspace/lib/math/include/trig.h

    r2c7fdaa rc0c38c7c  
    3636#define LIBMATH_TRIG_H_
    3737
    38 extern double double_sin(double);
    39 extern double double_cos(double);
     38extern float64_t float64_sin(float64_t);
     39extern float64_t float64_cos(float64_t);
    4040
    4141#endif
Note: See TracChangeset for help on using the changeset viewer.