سؤال

أعلم أن السؤال يبدو غريبا.المبرمجين في بعض الأحيان أفكر كثيرا.يرجى قراءة على...

في ج يمكنني استخدام signed و unsigned الاعداد الصحيحه الكثير.أنا أحب حقيقة أن المترجم يحذر لي إذا كنت تفعل أشياء مثل إسناد صحيح وقعت على غير متغير.أنا الحصول على تحذيرات اذا قارنت وقعت مع غير صحيحة وأكثر من ذلك بكثير.

أنا مثل هذه التحذيرات.أنها تساعد لي للحفاظ على رمز الصحيح.

لماذا لا يكون لدينا نفس الفاخرة على العربات ؟ الجذر التربيعي بالتأكيد لن يعودوا أبدا رقما سلبيا.هناك أماكن أخرى أيضا حيث سلبي تعويم قيمة ليس له معنى.المرشح المثالي غير موقعة تطفو.

Btw أنا لست حريصا على واحد بت إضافية من الدقة التي لا يمكن أن تحصل من خلال إزالة علامة قليلا من العوامات.أنا سعيد للغاية مع floats كما هي الآن.أود فقط أن علامة تعويم كما موقعة في بعض الأحيان الحصول على نفس النوع من التحذيرات التي أحصل عليها مع الاعداد الصحيحه.

أنا لست على علم بأي لغة البرمجة التي تدعم موقعة أرقام النقطة العائمة.

أي فكرة لماذا لا وجود لها ؟


تحرير:

وأنا أعلم أن x87 FPU لا يوجد لديه تعليمات للتعامل مع غير موقعة يطفو.يسمح فقط استخدام وقعت تطفو التعليمات.سوء الاستخدام (مثلا ، تسير تحت الصفر) يمكن أن يعتبر غير معروف السلوك في نفس الطريقة كما تجاوز وقعت الأعداد الصحيحة غير معرف.

هل كانت مفيدة؟

المحلول

لماذا لم يكن لديك C ++ الدعم ليطفو غير موقعة هو بسبب عدم وجود عمليات رمز الجهاز تعادل وحدة المعالجة المركزية لتنفيذ. لذلك سيكون من غير فعالة للغاية لتقديم الدعم لها.

إذا لم C ++ يعتمد عليه، فإنك سوف تكون في بعض الأحيان باستخدام تعويم غير موقعة ودون أن يدركوا أن قتل أدائك فقط. إذا C ++ مدعومة من ثم سوف تحتاج كل عملية نقطة عائمة إلى أن يتم التحقق لمعرفة ما إذا كان وقع ذلك أم لا. والبرامج التي تفعل الملايين من عملية نقطة عائمة، وهذا أمر غير مقبول.

ولذا فإن السؤال سيكون لماذا لا منفذي الأجهزة يعتمد عليه. وأعتقد أن الجواب على ذلك هو أنه لا يوجد معيار تعويم غير موقعة محددة أصلا. منذ اللغات ترغب في أن تكون متوافقة إلى الوراء، حتى لو كانت مضافة اللغات لا يمكن الاستفادة منه. لمعرفة المواصفات النقطة العائمة يجب أن ننظر في IEEE معيار 754 الفاصلة العائمة .

ويمكنك الحصول على جميع أنحاء لا وجود غير موقعة العائمة نوع نقطة على الرغم من خلال خلق طبقة تعويم غير الموقعة التي بتغليف تعويم أو مزدوج ويلقي تحذيرات إذا حاولت تمرير في رقما سالبا. وهذا هو أقل كفاءة، ولكن ربما إذا كنت لا تستخدم لهم بشكل مكثف فلن يهمني ذلك فقدان الأداء طفيفة.

وأنا بالتأكيد أرى فائدة من وجود تعويم غير موقعة. لكن C / C ++ يميل لاختيار الكفاءة التي يعمل على نحو أفضل للجميع على السلامة.

نصائح أخرى

وهناك فرق كبير بين الأعداد الصحيحة وقعت وغير موقعة في C / C ++:

value >> shift

والقيم وقعت تترك على حالها أعلى قليلا (علامة تمتد)، والقيم غير موقعة اضحة بت العلوي.

والسبب هو عدم وجود تعويم غير الموقعة هو أن تقوم بتشغيل بسرعة في جميع أنواع المشاكل إذا كانت هناك أية قيم سلبية. النظر في هذا:

float a = 2.0f, b = 10.0f, c;
c = a - b;

ما هي القيمة لا ج ديك؟ -8. ولكن ماذا يعني هذا في النظام دون الأرقام السالبة. FLOAT_MAX - 8 ربما؟ في الواقع، أن لا يعمل كما هو FLOAT_MAX - 8 هو FLOAT_MAX وذلك بسبب الآثار الدقة من الأشياء، بل هي أكثر معطوب. ماذا لو كان جزء من التعبير أكثر تعقيدا:

float a = 2.0f, b = 10.0f, c = 20.0f, d = 3.14159f, e;
e = (a - b) / d + c;

وهذه ليست مشكلة بالنسبة صحيحة نظرا لطبيعة نظام المتمم 2 ل.

ضع في اعتبارك أيضا وظائف حسابية القياسية: أن الخطيئة، كوس وتأن تعمل فقط لمدة نصف القيم مدخلاتها، لا يمكن العثور على السجل القيم <1، لا يمكن حل المعادلات من الدرجة الثانية: س = (-b + / - جذر (ب ب - 4.ac)) / 2.A، وهلم جرا. في الواقع، فإنه على الأرجح لن يجدي نفعا لأي وظيفة معقدة مثل هذه تميل إلى أن تنفذ في تقريب كثيرات الحدود التي ستستخدم القيم السلبية في مكان ما.

وهكذا، يطفو غير موقعة غير مجدية جدا.

ولكن هذا لا يعني أن نقول إن الفئة التي تتراوح الشيكات تطفو القيم ليست مفيدة، قد ترغب في كبح القيم إلى نطاق معين، على سبيل المثال الحسابات RGB.

و(بوصفها جانبا، بيرل 6 يتيح لك كتابة

subset Nonnegative::Float of Float where { $_ >= 0 };

وبعد ذلك يمكنك استخدام Nonnegative::Float مثلما تفعل مع أي نوع آخر).

وليس هناك دعم الأجهزة غير موقعة عملية نقطة عائمة، لذلك C لا تقدم عليه. تم تصميم C في الغالب أن يكون "التجمع المحمولة"، وهذا هو، وعلى مقربة من المعادن كما يمكن أن يكون دون أن تكون مرتبطة وصولا الى منصة محددة.

[عدل]

وC مثل التجمع: ما تراه هو بالضبط ما تحصل عليه. ضمنية "سوف تحقق أن هذا هو تعويم غير سلبي بالنسبة لك" يتعارض مع فلسفة التصميم. إذا كنت تريد ذلك حقا، يمكنك إضافة assert(x >= 0) أو ما شابه ذلك، ولكن عليك أن تفعل ذلك صراحة.

وأعتقد أن unsigned int تم إنشاؤه بسبب الحاجة إلى قيمة أكبر هامش من توقيع الباحث يمكن أن تقدم.

تعويم لديه أكبر بكثير الهامش ، لذا لم يكن هناك 'المادية' حاجة غير موقعة تطفو.و كما كنت أشير نفسك في سؤالك ، الإضافية 1 بت الدقة شيء قتل.

تحرير: بعد قراءة الجواب بواسطة Brian R.بوندي, لدي تعديل جوابي:هو بالتأكيد حق الأساسية وحدة المعالجة المركزية لا تملك غير موقعة تطفو العمليات.ومع ذلك, الحفاظ على اعتقادي أن هذا القرار التصميم استنادا إلى الأسباب التي ذكرت أعلاه ;-)

وأعتقد تريب هو على الطريق الصحيح. انها أكثر أهمية بالنسبة الأعداد الصحيحة التي لديك نوع المقابلة غير موقعة. تلك هي تلك التي تستخدم في المكره قليلا واستخدامها في بت الخرائط . وهناك القليل علامة يحصل فقط في الطريق. على سبيل المثال، بزر الماوس الأيمن تحويل قيمة سالبة، القيمة الناتجة هي تنفيذ محددة في C ++. فعل ذلك مع عدد صحيح غير موقعة أو تفيض هذا واحد وقد حددت تماما دلالات لأنه لا يوجد مثل هذا الشيء في الطريق.

وهكذا على الأعداد الصحيحة على الأقل، والحاجة إلى نوع غير موقعة منفصل أقوى من مجرد إعطاء التحذيرات. لا بد من النظر فيها ليطفو جميع النقاط المذكورة أعلاه. لذا، هناك، وأعتقد، لا حاجة حقيقية لدعم الأجهزة بالنسبة لهم، وC وبالفعل لا ندعمهم في تلك المرحلة.

واعتقد ان ذلك يعتمد على أن IEEE نقطة عائمة مواصفات يتم توقيع فقط وأن معظم لغات البرمجة استخدامها.

ويكيبيديا articla على أرقام النقطة العائمة IEEE

وتحرير: أيضا، كما لوحظ من قبل الآخرين، ومعظم الأجهزة لا يدعم يطفو غير سلبية، وبالتالي فإن النوع العادي من العوامات أكثر كفاءة للقيام لأنه ليس هناك دعم الأجهزة

<اقتباس فقرة>   

وA-الجذر التربيعي وبالتأكيد لن يعودوا أبدا رقما سالبا. هناك أماكن أخرى أيضا حيث قيمة تعويم السلبية لها أي معنى. الكمال مرشح لتعويم غير موقعة.

وC99 تدعم الأرقام المعقدة، ونوع وشكل عام من الجذر التربيعي، لذلك سوف sqrt( 1.0 * I) تكون سلبية.


وأبرز commentors لمعان طفيف أعلاه، في أن الأول كان يشير إلى sqrt من نوع عام ماكرو بدلا من وظيفة، وأنه سيعود العددية العائمة قيمة النقطة اقتطاع من المجمع إلى عنصرها الحقيقي:

#include <complex.h>
#include <tgmath.h>

int main () 
{
    complex double a = 1.0 + 1.0 * I;

    double f = sqrt(a);

    return 0;
}

وكما أنه يحتوي على الدماغ ضرطة، وجزء حقيقي من الجذر التربيعي من أي عدد معقدة إيجابية أو صفر، والجذر التربيعي (1.0 * I) هو الجذر التربيعي (0.5) + الجذر التربيعي (0.5) * أنا لا -1.0.

وأعتقد أن السبب الرئيسي هو أن يطفو غير موقعة سيكون له استخدامات محدودة حقا مقارنة [إينتس] غير موقعة. انا لا اقبل حجة أنه لأن الأجهزة لا يعتمد عليه. كان المعالجات القديمة لا قدرات نقطة عائمة في كل شيء، ومحاكاته كل ما في مجال البرمجيات. إذا كانت تعوم غير موقعة مفيدة لكان قد تم تنفيذه في البرنامج أولا وأن الأجهزة قد حذت حذوها.

يتم تعريف

وأنواع صحيحا غير موقعة في C في مثل هذه الطريقة الانصياع لقواعد حلقة جبري مجردة. على سبيل المثال، لأي X قيمة وY، مضيفا XY إلى Y سوف تسفر مضمونة X. أنواع صحيحا غير الموقعة على طاعة هذه القواعد في جميع الحالات التي لا تنطوي على التحويل إلى أو من أي نوع عددي أخرى [أو أنواع غير موقعة من أحجام مختلفة] وهذا الضمان هو واحد من أهم سمة من سمات هذا النوع. في بعض الحالات، فإنه من المفيد للتخلي عن القدرة على تمثيل الأرقام السالبة في مقابل الحصول على ضمانات اضافية لا يمكن إلا أن أنواع غير موقعة تقدم. أنواع الفاصلة العائمة، سواء وقعت أم لا، لا يمكن الالتزام بجميع قواعد حلقة جبري [على سبيل المثال لا يمكن أن تضمن أن X + Y-Y سوف تساوي X]، وبالفعل IEEE حتى لا تسمح لهم على الالتزام بقواعد فئة التكافؤ [عن طريق اشتراط أن بعض القيم مقارنة غير متكافئة لأنفسهم]. لا أعتقد ب "غير الموقعة" نوع الفاصلة العائمة يمكن أن تلتزم أي البديهيات التي عادية نوع الفاصلة العائمة لا يمكن، لذلك أنا لست متأكدا ما المزايا التي ستقدم.

وأظن أنه بسبب المعالجات الأساسية المستهدفة من قبل المجمعين C لا تملك وسيلة جيدة للتعامل مع أرقام النقطة العائمة غير موقعة.

IHMO ذلك بسبب دعم كل الموقعة وغير لأنواع النقطة العائمة في أي من الأجهزة أو البرمجيات سوف تكون مزعجة جدا

أجل صحيح الأنواع يمكننا الاستفادة على نفس المنطق وحدة كل الموقعة وغير صحيح العمليات في معظم الحالات باستخدام لطيفة العقار من 2 تكمل لأن والنتيجة هي متطابقة في تلك الحالات على add, sub, غير اتساع مول و معظم المعامل العمليات.العمليات التي تفرق بين الموقعة و غير الموقعة الإصدار لا يزال بوسعنا أن حصة الأغلبية من المنطق.على سبيل المثال

  • الحسابية و المنطقية التحول تحتاج فقط تغيير طفيف في حشو أعلى بت
  • اتساع الضرب يمكن استخدام نفس الأجهزة الرئيسية جزء ثم منفصلة المنطق لضبط نتيجة لتغيير signness.غير أنه في الوقت مضاعفات ولكن من الممكن أن تفعل
  • وقعت المقارنة يمكن تحويلها إلى موقعة مقارنة والعكس بسهولة عن طريق تبديل أعلى قليلا أو إضافة INT_MIN.أيضا ممكن نظريا ، ربما لا تستخدم على الأجهزة ، ومع ذلك فإنه من المفيد على النظم التي تدعم نوع واحد فقط من المقارنة (مثل 8080 أو 8051)

الأنظمة التي تستخدم 1 يكمل أيضا تحتاج فقط القليل من التعديل إلى المنطق لأنها ببساطة تحمل بت ملفوفة حول البت الأقل أهمية.غير متأكد حول توقع حجم النظم لكن يبدو أنهم استخدام 1 يكمل داخليا حتى وينطبق الشيء نفسه

للأسف نحن لا هذا الترف بالنسبة لأنواع النقطة العائمة. ببساطة عن طريق تحرير علامة قليلا سيكون لدينا نسخة غير موقعة.ولكن بعد ذلك ماذا يجب علينا استخدام هذا الشيء ؟

  • زيادة نطاق عن طريق إضافته إلى الأس
  • زيادة الدقة عن طريق إضافته إلى العشري.هذا هو في كثير من الأحيان أكثر فائدة ، ونحن عموما تحتاج إلى المزيد من الدقة من مجموعة

ولكن كل الخيارات حاجة أكبر الأفعى لاستيعاب على أوسع نطاق القيمة.الذي يزيد من تعقيد المنطق حين الأفعى أعلى قليلا يجلس هناك غير مستخدمة أكثر من مرة.أكثر الدوائر سوف تكون هناك حاجة إلى الضرب ، الشعب أو غيرها من العمليات المعقدة

على الأنظمة التي تستخدم البرمجيات النقطة العائمة تحتاج 2 الإصدارات لكل وظيفة والتي لم يكن من المتوقع خلال الفترة الذاكرة الكثير من تكلفة ، أو سيكون لديك للعثور على بعض "صعبة" وسيلة لتبادل أجزاء الموقعة و غير الموقعة وظائف

ومع ذلك النقطة العائمة الأجهزة كانت موجودة قبل وقت طويل ج اخترع, لذا أعتقد أن الاختيار في ج كان بسبب عدم وجود دعم الأجهزة بسبب الأسباب التي ذكرتها أعلاه

وقال أن هناك عدة المتخصصة غير الموقعة الفاصلة العائمة صيغ أساسا لمعالجة الصور الأغراض ، مثل Khronos المجموعة 10 و 11 بت النقطة العائمة نوع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top