إذا كنت بحاجة إلى حسابات دقيقة، وخاصةً إذا كنت تعمل مع بيانات مالية أو بيانات أعمال تتطلب دقة عالية، فمن الأفضل استخدام Decimal بدلًا من ذلك.قد تؤدي الأعداد ذات الفاصلة العائمة إلى نتائج غير دقيقة، كما هو موضح أدناه:
Float32—float.Float64—double.
Float32—FLOAT,REAL,SINGLE.Float64—DOUBLE,DOUBLE PRECISION.
FLOAT(12) وFLOAT(15, 22) وDOUBLE(12) وDOUBLE(4, 18))، لكن ClickHouse يتجاهلها.
استخدام الأعداد ذات الفاصلة العائمة
- قد تؤدي العمليات الحسابية على الأعداد ذات الفاصلة العائمة إلى حدوث خطأ في التقريب.
- تعتمد نتيجة الحساب على طريقة إجرائه (نوع المعالج ومعمارية نظام الحاسوب).
- قد تؤدي حسابات الفاصلة العائمة إلى قيم مثل اللانهاية (
Inf) و”ليس عددًا” (NaN). ينبغي أخذ ذلك في الاعتبار عند معالجة نتائج الحسابات. - عند تحليل الأعداد ذات الفاصلة العائمة من النص، قد لا تكون النتيجة أقرب عدد يمكن للآلة تمثيله.
NaN و Inf
Inf– ما لا نهاية.
-Inf— سالب ما لا نهاية.
NaN— ليس عددًا.
NaN في قسم عبارة ORDER BY.
قيم NaN في دلالات المجموعات
NaN بحيث تُرجع المقارنة القياسية NaN = NaN القيمة false.
ويتبع ClickHouse هذه القاعدة مع العامل =.
لكن NaN ليست قيمة واحدة؛ بل تمثل أي نمط بتات يكون فيه الأسّ مكوّنًا بالكامل من الواحدات وتكون
المانتيسا غير صفرية. ويمكن أن تنتج العمليات المختلفة ومعماريات CPU المختلفة قيم NaN
ببتات إشارة مختلفة أو بحمولات مختلفة للمانتيسا. على سبيل المثال:
- تنتج
0./0.قيمةNaNيكون بت الإشارة فيها 1 على معظم منصات x86. - تنتج القيمة الحرفية
nanقيمةNaNيكون بت الإشارة فيها 0. - بعد PR #98230، يُرجع مسار AArch64 NEON لـ
logقيمةNaNيختلف فيها بت الإشارة عنlogالقياسي في glibc عند المُدخلات السالبة.
NaN إلى
حاويات مختلفة وتُعامَل على أنها قيم مميزة في العمليات ذات دلالات المجموعات، بما في ذلك
DISTINCT وGROUP BY وuniqExact وcountDistinct وequi-JOIN على مفتاح Float:
NaN لا تساوي أي قيمة أخرى، بما في ذلك نفسها)
لكن ذلك قد يكون مفاجئًا. إذا كنت بحاجة إلى أن تتعامل العمليات ذات دلالات المجموعات مع جميع قيم NaN على أنها متساوية،
فوحِّد تمثيلها القياسي في الاستعلام:
DISTINCT وGROUP BY وJOIN.
BFloat16
BFloat16 هو نوع بيانات بفاصلة عائمة بعرض 16 بت، يتضمن أسًّا بعرض 8 بت، وإشارة، ومانتيسا بعرض 7 بت.
وهو مفيد لتطبيقات التعلّم الآلي والذكاء الاصطناعي.
يدعم ClickHouse التحويل بين Float32 وBFloat16،
ويمكن تنفيذ ذلك باستخدام الدالتين toFloat32() أو toBFloat16.
معظم العمليات الأخرى غير مدعومة.