Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  qfloat.h

  Sprache: C
 

// qfloat.h
//
//      C++ class for q-type floating point arithmetic.
//
// SYNOPSIS:
//
// #include "qfloat.h"
//
// qfloat a, b, c;
// a = b * c - 1.5;
//
// DESCRIPTION:
//
// Provides C++ arithmetic operators, functions, and type conversions
// for Q type floating point arithmetic.  Programs must be linked
// with the library libmq.a of supporting Q type routines.
//
// Using the GNU GCC compiler, the -O3 switch enables inlining which
// generates fairly efficient code for the various function calls.
// This class reportedly works with Microsoft and Borland C++ also.
//
// On a Sun sparcstation, references to long double type should use
// the e113 functions; IBM PC uses e64.  On machines that have no
// extended precision long double, just use etoq, qtoe. 
//
// Cephes Math Library Release 2.4:  April, 1996
// Copyright 1996 by Stephen L. Moshier

#ifndef __QFLOAT_H
#define __QFLOAT_H

// Be sure the declaration below matches QELT and NQ from qhead.h.
// #include "qhead.h"

struct qfloatstruct
  {
//    QELT ar[NQ];
    unsigned int ar[14];
  };

extern "C"
{
  void qclear (qfloatstruct *);
  void e24toq (const float *, qfloatstruct *);
  void etoq (const double *, qfloatstruct *);
  void e64toq (const long double *, qfloatstruct *);
  void e113toq (const long double *, qfloatstruct *);
  void ltoq (long int *, qfloatstruct *);
  void asctoq (const char *, qfloatstruct *);
}

class qfloat
{
  public:
  struct qfloatstruct a;
// Constructor.
  qfloat () {};
//  qfloat () {qclear(&a);};
// Conversions from base classes to qfloat.
  qfloat (float x) {e24toq (&x, &a);}
  qfloat (double x) {etoq (&x, &a);}
//  qfloat (long double x) {etoq (&x, &a);}
  qfloat (long double x) {e64toq (&x, &a);}
//  qfloat (long double x) {e113toq (&x, &a);}
  qfloat (long int x) {ltoq (&x, &a);}
  qfloat (int x) {long lx = x; ltoq (&lx, &a);}
// For conversion and assignment, e.g.,  x = "1.234e4321"
  qfloat (char *x) {asctoq (x, &a);}
// Type conversion to a base class is not possible in C++,
// so you have to use these functions instead, e.g. int i = qtoi(q);
  friend int qtoi (qfloat);
  friend long qtol (qfloat);
  friend float qtof (qfloat);
  friend double qtod (qfloat);
  friend long double qtold (qfloat);
};

extern "C"
{
  void qadd (const qfloat &, const qfloat &, qfloat &);
  void qsub (const qfloat &, const qfloat &, qfloat &);
  void qmul (const qfloat &, const qfloat &, qfloat &);
  void qdiv (const qfloat &, const qfloat &, qfloat &);
  int qcmp (const qfloat &, const qfloat &);
  void qtoasc (const qfloat *, char *, const int);
  void qtoe24 (const qfloat *, float *);
  void qtoe (const qfloat *, double *);
  void qtoe64 (const qfloat *, long double *);
  void qtoe113 (const qfloat *, long double *);
  void qifrac (const qfloat *, long *, qfloat *);
  void qabs (qfloat *);
  void qneg (qfloat *);
  void qsqrt (const qfloat *, qfloat *);
  int mtherr (char *, int);
  void qfloor (const qfloat *, qfloat *);
  void qpow (const qfloat *, const qfloat *, qfloat *);
  void qexp (const qfloat *, qfloat *);
  void qlog (const qfloat *, qfloat *);
  void qsin (const qfloat *, qfloat *);
  void qcos (const qfloat *, qfloat *);
  void qremain (const qfloat *, const qfloat *, qfloat *);
}


// Conversion to base class.

inline int qtoi (qfloat x)
{
  qfloat y;
  long l;
  qifrac(&x, &l, &y);
  return (int) l;
}

inline long qtol (qfloat x) {qfloat y; long l; qifrac(&x, &l, &y); return l;}

inline float qtof (qfloat x) {float f; qtoe24(&x, &f); return f;}

inline double qtod (qfloat x) {double d; qtoe(&x, &d); return d;}

//inline long double qtold (qfloat x) {long double d; qtoe(&x, &d); return d;}
inline long double qtold (qfloat x) {long double d; qtoe64(&x, &d); return d;}
//inline long double qtold (qfloat x) {long double d; qtoe113(&x, &d); return d;}


// Arithmetic operators.

inline void operator += (qfloat & x, const qfloat & y)
{
  qadd (x, y, x);
}

inline qfloat operator + (const qfloat & x, const qfloat & y)
{
  qfloat z;
  qadd (x, y, z);
  return z;
}

inline qfloat operator - (const qfloat & x, const qfloat & y)
{
  qfloat z;
  qsub (y, x, z);
  return z;
}

// Unary negation.
inline qfloat operator - (const qfloat & x)
{
  qfloat z;
  z = x;
  qneg (&z);
  return z;
}

inline void operator -= (qfloat & x, const qfloat & y)
{
  qsub (y, x, x);
}

inline qfloat operator * (const qfloat & x, const qfloat & y)
{
  qfloat z;
  qmul (x, y, z);
  return z;
}

inline void operator *= (qfloat & x, const qfloat & y)
{
  qmul (y, x, x);
}

inline qfloat operator / (const qfloat & x, const qfloat & y)
{
  qfloat z;
  qdiv (y, x, z);
  return z;
}

inline void operator /= (qfloat & x, const qfloat & y)
{
  qdiv (y, x, x);
}


// Comparisons.

inline int operator == (const qfloat & x, const qfloat & y)
{
  return (qcmp (x, y) == 0);
}

inline int operator != (const qfloat & x, const qfloat & y)
{
  return (qcmp (x, y) != 0);
}

inline int operator < (const qfloat & x, const qfloat & y)
{
  return (qcmp (x, y) == -1);
}

inline int operator > (const qfloat & x, const qfloat & y)
{
  return (qcmp (x, y) == 1);
}

inline int operator >= (const qfloat & x, const qfloat & y)
{
  return (qcmp (x, y) >= 0);
}

inline int operator <= (const qfloat & x, const qfloat & y)
{
  return (qcmp (x, y) <= 0);
}


// Overloaded functions.
// Define other function calls analogously.

inline qfloat sqrt (const qfloat & x)
{
  qfloat y;
  qsqrt (&x, &y);
  return y;
}

inline qfloat floor (const qfloat &x)
{
  qfloat y;
  qfloor (&x, &y);
  return y;
}

// Exact remainder of x/y.
inline qfloat fmod (const qfloat & x, const qfloat & y)
{
  qfloat z;
  qremain (&y, &x, &z);
  return z;
}

inline qfloat fabs (const qfloat & x)
{
  qfloat y;
  y = x;
  qabs (&y);
  return y;
}

// inline qfloat abs (const qfloat & x)
// {
//   qfloat y;
//   y = x;
//   qabs (&y);
//   return y;
// }

inline qfloat pow (const qfloat & x, const qfloat & y)
{
  qfloat z;
  qpow (&x, &y, &z);
  return z;
}

inline qfloat exp (const qfloat & x)
{
  qfloat y;
  qexp (&x, &y);
  return y;
}

inline qfloat log (const qfloat & x)
{
  qfloat y;
  qlog (&x, &y);
  return y;
}

inline qfloat sin (const qfloat & x)
{
  qfloat y;
  qsin (&x, &y);
  return y;
}

inline qfloat cos (const qfloat & x)
{
  qfloat y;
  qcos (&x, &y);
  return y;
}

// Print decimal value of X with N digits.  Precede value with string s1,
// follow with string s2.
#include <stdio.h>
inline void qprint ( const int n, const char *s1, const qfloat &x,
       const char *s2)
{
  char str[30];
  qtoasc (&x, str, n);
  printf ("%s %s %s", s1, str, s2);
}

#endif /* __QFLOAT_H */

Messung V0.5 in Prozent
C=82 H=100 G=91

¤ Dauer der Verarbeitung: 0.21 Sekunden  (vorverarbeitet am  2026-06-27) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik