-
-
Notifications
You must be signed in to change notification settings - Fork 11
np.finfo
support for quaddtype
#159
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,14 +8,18 @@ | |
get_quadblas_version | ||
) | ||
|
||
from dataclasses import dataclass | ||
|
||
__all__ = [ | ||
'QuadPrecision', 'QuadPrecDType', 'SleefQuadPrecision', 'LongDoubleQuadPrecision', | ||
'SleefQuadPrecDType', 'LongDoubleQuadPrecDType', 'is_longdouble_128', | ||
# Constants | ||
'pi', 'e', 'log2e', 'log10e', 'ln2', 'ln10', 'max_value', 'epsilon', | ||
'smallest_normal', 'smallest_subnormal', 'bits', 'precision', 'resolution', | ||
# QuadBLAS related functions | ||
'set_num_threads', 'get_num_threads', 'get_quadblas_version' | ||
'set_num_threads', 'get_num_threads', 'get_quadblas_version', | ||
# finfo class | ||
'QuadPrecFinfo' | ||
] | ||
|
||
def SleefQuadPrecision(value): | ||
|
@@ -43,3 +47,39 @@ def LongDoubleQuadPrecDType(): | |
bits = get_sleef_constant("bits") | ||
precision = get_sleef_constant("precision") | ||
resolution = get_sleef_constant("resolution") | ||
|
||
@dataclass | ||
class QuadPrecFinfo: | ||
"""Floating-point information for quadruple precision dtype. | ||
|
||
This class provides information about the floating-point representation | ||
used by the QuadPrecDType, similar to numpy.finfo but customized for | ||
quad precision arithmetic. | ||
""" | ||
bits: int = int(bits) | ||
eps: float = float(epsilon) | ||
epsneg: float = float(epsilon) | ||
|
||
iexp: int = int(precision) | ||
|
||
machar: object = None | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is this property? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is just an object finfo uses to fetch the finfo properties for dtypes, since we are defining them in our package hence marking it as None |
||
machep: float = float(epsilon) | ||
|
||
max: float = float(max_value) | ||
maxexp: float = float(max_value) | ||
|
||
min: float = float(smallest_normal) | ||
|
||
minexp: float = float(smallest_normal) | ||
|
||
negep: float = float(epsilon) | ||
|
||
nexp: int = int(bits) - int(precision) - 1 | ||
|
||
nmant: int = int(precision) | ||
|
||
precision: int = int(precision) | ||
resolution: float = float(resolution) | ||
tiny: float = float(smallest_normal) | ||
smallest_normal: float = float(smallest_normal) | ||
smallest_subnormal: float = float(smallest_subnormal) | ||
|
||
def get(self, attr): | ||
return getattr(self, attr, None) | ||
|
||
def __str__(self): | ||
return f"QuadPrecFinfo(precision={self.precision}, resolution={self.resolution})" | ||
|
||
def __repr__(self): | ||
return f"QuadPrecFinfo(max={self.max}, min={self.min}, eps={self.eps}, bits={self.bits})" |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -224,13 +224,42 @@ QuadPrecDType_str(QuadPrecDTypeObject *self) | |
return PyUnicode_FromFormat("QuadPrecDType(backend='%s')", backend_str); | ||
} | ||
|
||
static PyObject * | ||
QuadPrecDType_finfo(QuadPrecDTypeObject *self, PyObject *args) | ||
{ | ||
PyObject *numpy_quaddtype_module = PyImport_ImportModule("numpy_quaddtype"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't like doing this as well, but for now it works so |
||
if (numpy_quaddtype_module == NULL) { | ||
return NULL; | ||
} | ||
|
||
PyObject *finfo_class = PyObject_GetAttrString(numpy_quaddtype_module, "QuadPrecFinfo"); | ||
Py_DECREF(numpy_quaddtype_module); | ||
|
||
if (finfo_class == NULL) { | ||
PyErr_SetString(PyExc_AttributeError, "Could not find QuadPrecFinfo class in numpy_quaddtype module."); | ||
return NULL; | ||
} | ||
|
||
PyObject *finfo_instance = PyObject_CallNoArgs(finfo_class); | ||
Py_DECREF(finfo_class); | ||
|
||
return finfo_instance; | ||
} | ||
|
||
static PyMethodDef QuadPrecDType_methods[] = { | ||
{"finfo", (PyCFunction)QuadPrecDType_finfo, METH_NOARGS, | ||
"Return floating-point information for this QuadPrecDType"}, | ||
{NULL, NULL, 0, NULL} | ||
}; | ||
|
||
PyArray_DTypeMeta QuadPrecDType = { | ||
{{ | ||
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "numpy_quaddtype.QuadPrecDType", | ||
.tp_basicsize = sizeof(QuadPrecDTypeObject), | ||
.tp_new = QuadPrecDType_new, | ||
.tp_repr = (reprfunc)QuadPrecDType_repr, | ||
.tp_str = (reprfunc)QuadPrecDType_str, | ||
.tp_methods = QuadPrecDType_methods, | ||
}}, | ||
}; | ||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.