File indexing completed on 2026-05-19 08:08:30
0001
0002
0003 #ifndef _CL_DFLOAT_H
0004 #define _CL_DFLOAT_H
0005
0006 #include "cln/number.h"
0007 #include "cln/dfloat_class.h"
0008 #include "cln/integer_class.h"
0009 #include "cln/float.h"
0010
0011 namespace cln {
0012
0013 CL_DEFINE_AS_CONVERSION(cl_DF)
0014
0015
0016
0017 extern const cl_DF operator- (const cl_DF& x);
0018
0019
0020
0021 extern cl_signean compare (const cl_DF& x, const cl_DF& y);
0022
0023
0024 extern uint32 equal_hashcode (const cl_DF& x);
0025
0026 inline bool operator== (const cl_DF& x, const cl_DF& y)
0027 { return compare(x,y)==0; }
0028 inline bool operator!= (const cl_DF& x, const cl_DF& y)
0029 { return compare(x,y)!=0; }
0030 inline bool operator<= (const cl_DF& x, const cl_DF& y)
0031 { return compare(x,y)<=0; }
0032 inline bool operator< (const cl_DF& x, const cl_DF& y)
0033 { return compare(x,y)<0; }
0034 inline bool operator>= (const cl_DF& x, const cl_DF& y)
0035 { return compare(x,y)>=0; }
0036 inline bool operator> (const cl_DF& x, const cl_DF& y)
0037 { return compare(x,y)>0; }
0038
0039
0040 extern bool minusp (const cl_DF& x);
0041
0042
0043 extern bool zerop (const cl_DF& x);
0044
0045
0046 extern bool plusp (const cl_DF& x);
0047
0048
0049 extern const cl_DF operator+ (const cl_DF& x, const cl_DF& y);
0050
0051 inline const cl_DF operator+ (const cl_DF& x, const double y)
0052 { return x + cl_DF(y); }
0053 inline const cl_DF operator+ (const double x, const cl_DF& y)
0054 { return cl_DF(x) + y; }
0055
0056
0057 extern const cl_DF operator- (const cl_DF& x, const cl_DF& y);
0058
0059 inline const cl_DF operator- (const cl_DF& x, const double y)
0060 { return x - cl_DF(y); }
0061 inline const cl_DF operator- (const double x, const cl_DF& y)
0062 { return cl_DF(x) - y; }
0063
0064
0065 extern const cl_DF operator* (const cl_DF& x, const cl_DF& y);
0066
0067 inline const cl_DF operator* (const cl_DF& x, const double y)
0068 { return x * cl_DF(y); }
0069 inline const cl_DF operator* (const double x, const cl_DF& y)
0070 { return cl_DF(x) * y; }
0071
0072
0073 inline const cl_DF square (const cl_DF& x) { return x*x; }
0074
0075
0076 extern const cl_DF operator/ (const cl_DF& x, const cl_DF& y);
0077
0078 inline const cl_DF operator/ (const cl_DF& x, const double y)
0079 { return x / cl_DF(y); }
0080 inline const cl_DF operator/ (const double x, const cl_DF& y)
0081 { return cl_DF(x) / y; }
0082
0083
0084 extern const cl_DF sqrt (const cl_DF& x);
0085
0086
0087 extern const cl_DF recip (const cl_DF& x);
0088
0089
0090 extern const cl_DF abs (const cl_DF& x);
0091
0092
0093
0094 inline const cl_DF plus1 (const cl_DF& x)
0095 {
0096 extern const cl_DF cl_I_to_DF (const cl_I&);
0097 return x + cl_I_to_DF(cl_I(1));
0098 }
0099
0100
0101 inline const cl_DF minus1 (const cl_DF& x)
0102 {
0103 extern const cl_DF cl_I_to_DF (const cl_I&);
0104 return x + cl_I_to_DF(cl_I(-1));
0105 }
0106
0107
0108
0109 extern const cl_DF ffloor (const cl_DF& x);
0110
0111
0112 extern const cl_DF fceiling (const cl_DF& x);
0113
0114
0115 extern const cl_DF ftruncate (const cl_DF& x);
0116
0117
0118 extern const cl_DF fround (const cl_DF& x);
0119
0120
0121
0122
0123 struct cl_DF_fdiv_t {
0124 cl_DF quotient;
0125 cl_DF remainder;
0126
0127 cl_DF_fdiv_t () {}
0128 cl_DF_fdiv_t (const cl_DF& q, const cl_DF& r) : quotient(q), remainder(r) {}
0129 };
0130
0131
0132 inline const cl_DF_fdiv_t ffloor2 (const cl_DF& x)
0133 { cl_DF q = ffloor(x); return cl_DF_fdiv_t(q,x-q); }
0134
0135
0136 inline const cl_DF_fdiv_t fceiling2 (const cl_DF& x)
0137 { cl_DF q = fceiling(x); return cl_DF_fdiv_t(q,x-q); }
0138
0139
0140 inline const cl_DF_fdiv_t ftruncate2 (const cl_DF& x)
0141 { cl_DF q = ftruncate(x); return cl_DF_fdiv_t(q,x-q); }
0142
0143
0144 inline const cl_DF_fdiv_t fround2 (const cl_DF& x)
0145 { cl_DF q = fround(x); return cl_DF_fdiv_t(q,x-q); }
0146
0147
0148
0149
0150 struct cl_DF_div_t {
0151 cl_I quotient;
0152 cl_DF remainder;
0153
0154 cl_DF_div_t () {}
0155 cl_DF_div_t (const cl_I& q, const cl_DF& r) : quotient(q), remainder(r) {}
0156 };
0157
0158
0159 inline const cl_DF_div_t floor2 (const cl_DF& x)
0160 {
0161 extern const cl_I cl_DF_to_I (const cl_DF& x);
0162 cl_DF q = ffloor(x);
0163 return cl_DF_div_t(cl_DF_to_I(q),x-q);
0164 }
0165 inline const cl_I floor1 (const cl_DF& x)
0166 {
0167 extern const cl_I cl_DF_to_I (const cl_DF& x);
0168 return cl_DF_to_I(ffloor(x));
0169 }
0170
0171
0172 inline const cl_DF_div_t ceiling2 (const cl_DF& x)
0173 {
0174 extern const cl_I cl_DF_to_I (const cl_DF& x);
0175 cl_DF q = fceiling(x);
0176 return cl_DF_div_t(cl_DF_to_I(q),x-q);
0177 }
0178 inline const cl_I ceiling1 (const cl_DF& x)
0179 {
0180 extern const cl_I cl_DF_to_I (const cl_DF& x);
0181 return cl_DF_to_I(fceiling(x));
0182 }
0183
0184
0185 inline const cl_DF_div_t truncate2 (const cl_DF& x)
0186 {
0187 extern const cl_I cl_DF_to_I (const cl_DF& x);
0188 cl_DF q = ftruncate(x);
0189 return cl_DF_div_t(cl_DF_to_I(q),x-q);
0190 }
0191 inline const cl_I truncate1 (const cl_DF& x)
0192 {
0193 extern const cl_I cl_DF_to_I (const cl_DF& x);
0194 return cl_DF_to_I(ftruncate(x));
0195 }
0196
0197
0198 inline const cl_DF_div_t round2 (const cl_DF& x)
0199 {
0200 extern const cl_I cl_DF_to_I (const cl_DF& x);
0201 cl_DF q = fround(x);
0202 return cl_DF_div_t(cl_DF_to_I(q),x-q);
0203 }
0204 inline const cl_I round1 (const cl_DF& x)
0205 {
0206 extern const cl_I cl_DF_to_I (const cl_DF& x);
0207 return cl_DF_to_I(fround(x));
0208 }
0209
0210
0211 extern const cl_DF_div_t floor2 (const cl_DF& x, const cl_DF& y);
0212 inline const cl_I floor1 (const cl_DF& x, const cl_DF& y) { return floor1(x/y); }
0213
0214
0215 extern const cl_DF_div_t ceiling2 (const cl_DF& x, const cl_DF& y);
0216 inline const cl_I ceiling1 (const cl_DF& x, const cl_DF& y) { return ceiling1(x/y); }
0217
0218
0219 extern const cl_DF_div_t truncate2 (const cl_DF& x, const cl_DF& y);
0220 inline const cl_I truncate1 (const cl_DF& x, const cl_DF& y) { return truncate1(x/y); }
0221
0222
0223 extern const cl_DF_div_t round2 (const cl_DF& x, const cl_DF& y);
0224 inline const cl_I round1 (const cl_DF& x, const cl_DF& y) { return round1(x/y); }
0225
0226
0227
0228 struct decoded_dfloat {
0229 cl_DF mantissa;
0230 cl_I exponent;
0231 cl_DF sign;
0232
0233 decoded_dfloat () {}
0234 decoded_dfloat (const cl_DF& m, const cl_I& e, const cl_DF& s) : mantissa(m), exponent(e), sign(s) {}
0235 };
0236
0237
0238
0239
0240 extern const decoded_dfloat decode_float (const cl_DF& x);
0241
0242
0243
0244
0245
0246 extern sintE float_exponent (const cl_DF& x);
0247
0248
0249 inline sintL float_radix (const cl_DF& x)
0250 {
0251 (void)x;
0252 return 2;
0253 }
0254
0255
0256 extern const cl_DF float_sign (const cl_DF& x);
0257
0258
0259
0260 extern uintC float_digits (const cl_DF& x);
0261
0262
0263
0264 extern uintC float_precision (const cl_DF& x);
0265
0266
0267
0268
0269
0270
0271 extern const cl_idecoded_float integer_decode_float (const cl_DF& x);
0272
0273
0274
0275 extern const cl_DF scale_float (const cl_DF& x, sintC delta);
0276 extern const cl_DF scale_float (const cl_DF& x, const cl_I& delta);
0277
0278
0279
0280 extern const cl_DF max (const cl_DF& x, const cl_DF& y);
0281
0282
0283 extern const cl_DF min (const cl_DF& x, const cl_DF& y);
0284
0285
0286 extern const cl_DF signum (const cl_DF& x);
0287
0288
0289
0290 extern float float_approx (const cl_DF& x);
0291
0292
0293 extern double double_approx (const cl_DF& x);
0294
0295
0296
0297 inline cl_DF& operator+= (cl_DF& x, const cl_DF& y) { return x = x + y; }
0298 inline cl_DF& operator+= (cl_DF& x, const double y) { return x = x + y; }
0299 inline cl_DF& operator++ (cl_DF& x) { return x = plus1(x); }
0300 inline void operator++ (cl_DF& x, int dummy) { (void)dummy; x = plus1(x); }
0301 inline cl_DF& operator-= (cl_DF& x, const cl_DF& y) { return x = x - y; }
0302 inline cl_DF& operator-= (cl_DF& x, const double y) { return x = x - y; }
0303 inline cl_DF& operator-- (cl_DF& x) { return x = minus1(x); }
0304 inline void operator-- (cl_DF& x, int dummy) { (void)dummy; x = minus1(x); }
0305 inline cl_DF& operator*= (cl_DF& x, const cl_DF& y) { return x = x * y; }
0306 inline cl_DF& operator*= (cl_DF& x, const double y) { return x = x * y; }
0307 inline cl_DF& operator/= (cl_DF& x, const cl_DF& y) { return x = x / y; }
0308 inline cl_DF& operator/= (cl_DF& x, const double y) { return x = x / y; }
0309
0310
0311
0312
0313
0314
0315 extern cl_class cl_class_dfloat;
0316
0317
0318
0319 #ifdef CL_DEBUG
0320 extern int cl_DF_debug_module;
0321 CL_FORCE_LINK(cl_DF_debug_dummy, cl_DF_debug_module)
0322 #endif
0323
0324 }
0325
0326 #endif