Ignore:
Timestamp:
Apr 10, 2003, 12:28:07 PM (22 years ago)
Author:
sandervl
Message:

PF: MSVCRT update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/msvcrt/math.c

    r9633 r10005  
    2020#ifdef __WIN32OS2__
    2121#include <emxheader.h>
     22#include <stdlib.h>
     23#include <string.h>
     24#include <math.h>
     25extern double logb(double);
     26extern double scalb(double,double);
    2227#else
    2328#include "config.h"
     
    2934#define __USE_ISOC9X 1
    3035#define __USE_ISOC99 1
    31 #include <math.h>
     36
    3237#ifdef HAVE_IEEEFP_H
    3338#include <ieeefp.h>
     
    4348#ifndef finite /* Could be a macro */
    4449#ifdef isfinite
    45 #define finite(x) isfinite(x)
     50#define finite(x) isfinite(x) 
    4651#else
    4752#define finite(x) (!isnan(x)) /* At least catch some cases */
     
    135140{
    136141  FPU_DOUBLE(x);
     142  dprintf(("MSVCRT: _CIacos"));
    137143  if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    138144  return acos(x);
     
    145151{
    146152  FPU_DOUBLE(x);
     153  dprintf(("MSVCRT: _CIacos"));
    147154  if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    148155  return asin(x);
     
    155162{
    156163  FPU_DOUBLE(x);
     164  dprintf(("MSVCRT: _CIacos"));
    157165  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    158166  return atan(x);
     
    165173{
    166174  FPU_DOUBLES(x,y);
     175  dprintf(("MSVCRT: _CIacos"));
    167176  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    168177  return atan2(x,y);
     
    175184{
    176185  FPU_DOUBLE(x);
     186  dprintf(("MSVCRT: _CIacos"));
    177187  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    178188  return cos(x);
     
    185195{
    186196  FPU_DOUBLE(x);
     197  dprintf(("MSVCRT: _CIacos"));
    187198  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    188199  return cosh(x);
     
    195206{
    196207  FPU_DOUBLE(x);
     208  dprintf(("MSVCRT: _CIacos"));
    197209  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    198210  return exp(x);
     
    205217{
    206218  FPU_DOUBLES(x,y);
    207   if (!finite(x) || !finite(y)) *MSVCRT__errno() = MSVCRT_EDOM;
     219  dprintf(("MSVCRT: _CIfmod %f %f",x,y)); 
     220  if (!finite(x) || !finite(y)) { *MSVCRT__errno() = MSVCRT_EDOM; dprintf(("ERROR!")); }
     221  dprintf(("MSVCRT: _CIfmod returning %f",fmod(x,y))); 
    208222  return fmod(x,y);
    209223}
     
    215229{
    216230  FPU_DOUBLE(x);
     231  dprintf(("MSVCRT: _CIacos"));
    217232  if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    218233  if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE;
     
    226241{
    227242  FPU_DOUBLE(x);
     243  dprintf(("MSVCRT: _CIacos"));
    228244  if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    229245  if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE;
     
    238254  double z;
    239255  FPU_DOUBLES(x,y);
     256  dprintf(("MSVCRT: _CIacos"));
    240257  /* FIXME: If x < 0 and y is not integral, set EDOM */
    241258  z = pow(x,y);
     
    250267{
    251268  FPU_DOUBLE(x);
     269  dprintf(("MSVCRT: _CIacos"));
    252270  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    253271  return sin(x);
     
    260278{
    261279  FPU_DOUBLE(x);
     280  dprintf(("MSVCRT: _CIacos"));
    262281  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    263282  return sinh(x);
     
    270289{
    271290  FPU_DOUBLE(x);
     291  dprintf(("MSVCRT: _CIacos"));
    272292  if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    273293  return sqrt(x);
     
    280300{
    281301  FPU_DOUBLE(x);
     302  dprintf(("MSVCRT: _CIacos"));
    282303  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    283304  return tan(x);
     
    290311{
    291312  FPU_DOUBLE(x);
     313  dprintf(("MSVCRT: _CIacos"));
    292314  if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
    293315  return tanh(x);
     
    324346int _fpclass(double num)
    325347{
     348  dprintf(("MSVCRT: _fpclass"));
    326349#if defined(HAVE_FPCLASS) || defined(fpclass)
    327350  switch (fpclass( num ))
     
    358381 *              _rotl (MSVCRT.@)
    359382 */
    360 unsigned int _rotl(unsigned int num, int shift)
     383unsigned int MSVCRT__rotl(unsigned int num, int shift)
    361384{
    362385  shift &= 31;
     
    369392double _logb(double num)
    370393{
     394  dprintf(("MSVCRT: _logb"));
    371395  if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
    372396  return logb(num);
     
    376400 *              _lrotl (MSVCRT.@)
    377401 */
    378 unsigned long _lrotl(unsigned long num, int shift)
    379 {
     402unsigned long MSVCRT__lrotl(unsigned long num, int shift)
     403{
     404  dprintf(("MSVCRT: _lrotl"));
    380405  shift &= 0x1f;
    381406  return (num << shift) | (num >> (32-shift));
     
    385410 *              _lrotr (MSVCRT.@)
    386411 */
    387 unsigned long _lrotr(unsigned long num, int shift)
    388 {
     412unsigned long MSVCRT__lrotr(unsigned long num, int shift)
     413{
     414  dprintf(("MSVCRT: _lrotr"));
    389415  shift &= 0x1f;
    390416  return (num >> shift) | (num << (32-shift));
     
    394420 *              _rotr (MSVCRT.@)
    395421 */
    396 unsigned int _rotr(unsigned int num, int shift)
    397 {
     422unsigned int MSVCRT__rotr(unsigned int num, int shift)
     423{
     424    dprintf(("MSVCRT: _rotr"));
    398425    shift &= 0x1f;
    399426    return (num >> shift) | (num << (32-shift));
     
    406433{
    407434  /* Note - Can't forward directly as libc expects y as double */
     435  dprintf(("MSVCRT: _scalb"));
    408436  double dblpower = (double)power;
    409437  if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
     
    414442 *              _matherr (MSVCRT.@)
    415443 */
    416 int _matherr(MSVCRT_exception *e)
     444int MSVCRT__matherr(MSVCRT_exception *e)
    417445{
    418446  if (e)
     
    478506{
    479507  double z = ldexp(num,exp);
    480 
     508  dprintf(("MSVCRT: ldexpp"));
    481509  if (!finite(z))
    482510    *MSVCRT__errno() = MSVCRT_ERANGE;
     
    489517 *              _cabs (MSVCRT.@)
    490518 */
    491 double _cabs(MSVCRT_complex num)
    492 {
     519double MSVCRT__cabs(MSVCRT_complex num)
     520{
     521  dprintf(("MSVCRT: _cabs"));
    493522  return sqrt(num.real * num.real + num.imaginary * num.imaginary);
    494523}
     
    499528double _chgsign(double num)
    500529{
     530   dprintf(("MSVCRT: _chgsign"));
    501531  /* FIXME: +-infinity,Nan not tested */
    502532  return -num;
     
    506536 *              _control87 (MSVCRT.@)
    507537 */
    508 unsigned int _control87(unsigned int newval, unsigned int mask)
     538unsigned int MSVCRT__control87(unsigned int newval, unsigned int mask)
    509539{
    510540#if defined(__GNUC__) && defined(__i386__)
     
    579609{
    580610#ifdef __i386__
    581   return _control87( newval, mask & ~_EM_DENORMAL );
     611  return MSVCRT__control87( newval, mask & ~_EM_DENORMAL );
    582612#else
    583613  FIXME(":Not Implemented!\n");
     
    589619 *              _copysign (MSVCRT.@)
    590620 */
    591 double _copysign(double num, double sign)
    592 {
     621double MSVCRT__copysign(double num, double sign)
     622{
     623  dprintf(("MSVCRT: _CIacos"));
    593624  /* FIXME: Behaviour for Nan/Inf? */
    594625  if (sign < 0.0)
     
    602633int  _finite(double num)
    603634{
     635  dprintf(("MSVCRT: _finite for %f returns %d",num, finite(num)?1:0));
    604636  return (finite(num)?1:0); /* See comment for _isnan() */
    605637}
     
    608640 *              _fpreset (MSVCRT.@)
    609641 */
    610 void _fpreset(void)
     642void MSVCRT__fpreset(void)
    611643{
    612644#if defined(__GNUC__) && defined(__i386__)
     
    625657   * Do the same, as the result may be used in calculations
    626658   */
     659  dprintf(("MSVCRT: _isnan for %f returns %d",num, isnan(num)?1:0));
    627660  return isnan(num) ? 1 : 0;
    628661}
     
    631664 *              _y0 (MSVCRT.@)
    632665 */
    633 double _y0(double num)
     666double MSVCRT__y0(double num)
    634667{
    635668  double retval;
     669  dprintf(("MSVCRT: _CIacos"));
    636670  if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
    637671  retval  = y0(num);
     
    647681 *              _y1 (MSVCRT.@)
    648682 */
    649 double _y1(double num)
     683double MSVCRT__y1(double num)
    650684{
    651685  double retval;
     686  dprintf(("MSVCRT: _CIacos"));
    652687  if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
    653688  retval  = y1(num);
     
    663698 *              _yn (MSVCRT.@)
    664699 */
    665 double _yn(int order, double num)
     700double MSVCRT__yn(int order, double num)
    666701{
    667702  double retval;
     703  dprintf(("MSVCRT: _CIacos"));
    668704  if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
    669705  retval  = yn(order,num);
     
    679715 *              _nextafter (MSVCRT.@)
    680716 */
    681 double _nextafter(double num, double next)
     717double MSVCRT__nextafter(double num, double next)
    682718{
    683719  double retval;
     720  dprintf(("MSVCRT: _CIacos"));
    684721  if (!finite(num) || !finite(next)) *MSVCRT__errno() = MSVCRT_EDOM;
    685   retval = nextafter(num,next);
     722  retval = MSVCRT__nextafter(num,next);
    686723  return retval;
     724}
     725
     726/*********************************************************************
     727 *              _ecvt (MSVCRT.@)
     728 */
     729char *_ecvt( double number, int ndigits, int *decpt, int *sign )
     730{
     731    MSVCRT_thread_data *data = msvcrt_get_thread_data();
     732    char *dec;
     733
     734    if (!data->efcvt_buffer)
     735        data->efcvt_buffer = MSVCRT_malloc( 80 ); /* ought to be enough */
     736
     737    _snprintf(data->efcvt_buffer, 80, "%.*e", ndigits /* FIXME wrong */, number);
     738    *sign = (number < 0);
     739    dec = strchr(data->efcvt_buffer, '.');
     740    *decpt = (dec) ? dec - data->efcvt_buffer : -1;
     741    return data->efcvt_buffer;
     742}
     743
     744/***********************************************************************
     745 *              _fcvt  (MSVCRT.@)
     746 */
     747char *_fcvt( double number, int ndigits, int *decpt, int *sign )
     748{
     749    MSVCRT_thread_data *data = msvcrt_get_thread_data();
     750    char *dec;
     751
     752    if (!data->efcvt_buffer)
     753        data->efcvt_buffer = MSVCRT_malloc( 80 ); /* ought to be enough */
     754
     755    _snprintf(data->efcvt_buffer, 80, "%.*e", ndigits, number);
     756    *sign = (number < 0);
     757    dec = strchr(data->efcvt_buffer, '.');
     758    *decpt = (dec) ? dec - data->efcvt_buffer : -1;
     759    return data->efcvt_buffer;
     760}
     761
     762/***********************************************************************
     763 *              _gcvt  (MSVCRT.@)
     764 *
     765 * FIXME: uses both E and F.
     766 */
     767char *MSVCRT__gcvt( double number, int ndigit, char *buff )
     768{
     769    sprintf(buff, "%.*E", ndigit, number);
     770    return buff;
    687771}
    688772
     
    695779 */
    696780#ifdef __i386__
    697 LONGLONG MSVCRT_div(int num, int denom)
    698 {
    699   LONGLONG retval;
     781long long MSVCRT_div(int num, int denom)
     782{
     783  long long retval;
    700784  div_t dt = div(num,denom);
    701   retval = ((LONGLONG)dt.rem << 32) | dt.quot;
     785  dprintf(("MSVCRT: div"));
     786  retval = ((long long)dt.rem << 32) | dt.quot;
    702787  return retval;
    703788}
     
    731816  ULONGLONG retval;
    732817  ldiv_t ldt = ldiv(num,denom);
     818  dprintf(("MSVCRT: ldiv"));
    733819  retval = ((ULONGLONG)ldt.rem << 32) | (ULONG)ldt.quot;
    734820  return retval;
     
    10011087  TRACE("(): stub\n");
    10021088}
     1089
     1090
     1091double MSVCRT_atof (__const__ char * str)
     1092{
     1093 double res;
     1094 res = atof(str);
     1095 dprintf(("MSVCRT: _atof - convert %s - result %f",str,res));
     1096 return res;
     1097}
Note: See TracChangeset for help on using the changeset viewer.