13
13
14
14
#include "scalar.h"
15
15
#include "scalar_ops.h"
16
+ #include "dragon4.h"
16
17
17
18
QuadPrecisionObject *
18
19
QuadPrecision_raw_new (QuadBackendType backend )
@@ -128,6 +129,29 @@ QuadPrecision_new(PyTypeObject *cls, PyObject *args, PyObject *kwargs)
128
129
return (PyObject * )QuadPrecision_from_object (value , backend );
129
130
}
130
131
132
+ static PyObject *
133
+ QuadPrecision_str_dragon4 (QuadPrecisionObject * self )
134
+ {
135
+ Dragon4_Options opt = {
136
+ .scientific = 0 ,
137
+ .digit_mode = DigitMode_Unique ,
138
+ .cutoff_mode = CutoffMode_TotalLength ,
139
+ .precision = SLEEF_QUAD_DIG ,
140
+ .sign = 1 ,
141
+ .trim_mode = TrimMode_LeaveOneZero ,
142
+ .digits_left = 1 ,
143
+ .digits_right = SLEEF_QUAD_DIG
144
+ };
145
+
146
+ if (self -> backend == BACKEND_SLEEF ) {
147
+ return Dragon4_Positional_QuadDType (& self -> value .sleef_value , opt .digit_mode , opt .cutoff_mode , opt .precision , opt .min_digits , opt .sign , opt .trim_mode , opt .digits_left , opt .digits_right );
148
+ }
149
+ else {
150
+ Sleef_quad sleef_val = Sleef_cast_from_doubleq1 (self -> value .longdouble_value );
151
+ return Dragon4_Positional_QuadDType (& sleef_val , opt .digit_mode , opt .cutoff_mode , opt .precision , opt .min_digits , opt .sign , opt .trim_mode , opt .digits_left , opt .digits_right );
152
+ }
153
+ }
154
+
131
155
static PyObject *
132
156
QuadPrecision_str (QuadPrecisionObject * self )
133
157
{
@@ -154,6 +178,39 @@ QuadPrecision_repr(QuadPrecisionObject *self)
154
178
return res ;
155
179
}
156
180
181
+ static PyObject *
182
+ QuadPrecision_repr_dragon4 (QuadPrecisionObject * self )
183
+ {
184
+ Dragon4_Options opt = {
185
+ .scientific = 1 ,
186
+ .digit_mode = DigitMode_Unique ,
187
+ .cutoff_mode = CutoffMode_TotalLength ,
188
+ .precision = SLEEF_QUAD_DIG ,
189
+ .sign = 1 ,
190
+ .trim_mode = TrimMode_LeaveOneZero ,
191
+ .digits_left = 1 ,
192
+ .exp_digits = 3
193
+ };
194
+
195
+ PyObject * str ;
196
+ if (self -> backend == BACKEND_SLEEF ) {
197
+ str = Dragon4_Scientific_QuadDType (& self -> value .sleef_value , opt .digit_mode , opt .precision , opt .min_digits , opt .sign , opt .trim_mode , opt .digits_left , opt .exp_digits );
198
+ }
199
+ else {
200
+ Sleef_quad sleef_val = Sleef_cast_from_doubleq1 (self -> value .longdouble_value );
201
+ str = Dragon4_Scientific_QuadDType (& sleef_val , opt .digit_mode , opt .precision , opt .min_digits , opt .sign , opt .trim_mode , opt .digits_left , opt .exp_digits );
202
+ }
203
+
204
+ if (str == NULL ) {
205
+ return NULL ;
206
+ }
207
+
208
+ const char * backend_str = (self -> backend == BACKEND_SLEEF ) ? "sleef" : "longdouble" ;
209
+ PyObject * res = PyUnicode_FromFormat ("QuadPrecision('%S', backend='%s')" , str , backend_str );
210
+ Py_DECREF (str );
211
+ return res ;
212
+ }
213
+
157
214
static void
158
215
QuadPrecision_dealloc (QuadPrecisionObject * self )
159
216
{
@@ -166,8 +223,8 @@ PyTypeObject QuadPrecision_Type = {
166
223
.tp_itemsize = 0 ,
167
224
.tp_new = QuadPrecision_new ,
168
225
.tp_dealloc = (destructor )QuadPrecision_dealloc ,
169
- .tp_repr = (reprfunc )QuadPrecision_repr ,
170
- .tp_str = (reprfunc )QuadPrecision_str ,
226
+ .tp_repr = (reprfunc )QuadPrecision_repr_dragon4 ,
227
+ .tp_str = (reprfunc )QuadPrecision_str_dragon4 ,
171
228
.tp_as_number = & quad_as_scalar ,
172
229
.tp_richcompare = (richcmpfunc )quad_richcompare
173
230
0 commit comments