1313
1414#include "scalar.h"
1515#include "scalar_ops.h"
16+ #include "dragon4.h"
1617
1718QuadPrecisionObject *
1819QuadPrecision_raw_new (QuadBackendType backend )
@@ -128,6 +129,29 @@ QuadPrecision_new(PyTypeObject *cls, PyObject *args, PyObject *kwargs)
128129 return (PyObject * )QuadPrecision_from_object (value , backend );
129130}
130131
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+
131155static PyObject *
132156QuadPrecision_str (QuadPrecisionObject * self )
133157{
@@ -154,6 +178,39 @@ QuadPrecision_repr(QuadPrecisionObject *self)
154178 return res ;
155179}
156180
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+
157214static void
158215QuadPrecision_dealloc (QuadPrecisionObject * self )
159216{
@@ -166,8 +223,8 @@ PyTypeObject QuadPrecision_Type = {
166223 .tp_itemsize = 0 ,
167224 .tp_new = QuadPrecision_new ,
168225 .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 ,
171228 .tp_as_number = & quad_as_scalar ,
172229 .tp_richcompare = (richcmpfunc )quad_richcompare
173230
0 commit comments