كيفية اختبار إذا الرقمية التحويل سيتم تغيير قيمة ؟

StackOverflow https://stackoverflow.com/questions/1601646

  •  05-07-2019
  •  | 
  •  

سؤال

انا أداء بعض تحويل نوع البيانات حيث يجب أن تمثل uint, long, ulong و decimal كما IEEE 754 ضعف قيم النقطة العائمة.كنت تريد أن تكون قادرة على الكشف عن إذا كان IEEE 754 نوع البيانات لا تحتوي على قيمة قبل تنفيذ عملية التحويل.

القوة الغاشمة حل التفاف محاولة اللحاق حول يلقي لمضاعفة تبحث عن OverflowException.القراءة من خلال بعض CLR الوثائق يعني أن بعض التحويلات فقط بصمت تغيير القيمة دون أي استثناءات.

هل هناك أي دليل على كذبة هذا الاختيار ؟ أنا أبحث عن اكتمال أكثر سهولة التنفيذ.لدي شعور أنني سوف تكون عن كثب القراءة IEEE 754 المواصفات والتحقق من matissa و الأس بعناية...

وأود أن أضيف أنني معظم المعنية تمثل كل الأرقام بدقة و الخسارة العائمة نقطة الدقة الثانوية القلق (ولكن لا يزال يستحق النظر).

تحرير: Int32 هي قادرة على أن تكون تماما كما أعرب عن IEE-754.أيضا Decimal نوع البيانات هو جزء كبير جدا من هذه المسألة.

تحديث مهم: إذا كنت تقصد هذا السؤال ، يجب عليك أيضا قراءة هذا السؤال: IEEE-754 مزدوجة (64-بت العائمة نقطة) مقابلطويلة (64-bit Integer) إعادة النظر

وتلاحظ وجود خلل في الجواب حيث بعض القيم الكبيرة هي أيضا قادرة على أن تكون بالضبط ممثلة IEEE-754.في حين أن هذا قد يعني أن القيمة بشكل صحيح ذهابا وإيابا على الغرض الأصلي (سوف ذهابا وإيابا إلى تفعيل جافا سكريبت) لن.

كما يبدو أن هناك خلل في CLRs النظام.نوع مزدوج لأنه لا بشكل صحيح تسمح هذه القيم ذهابا وإيابا.

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

المحلول

حل بسيط يمكن أن يكون شيئا مثل (إذا كان x عدد صحيح):

if ((int)(double)x != x) { 
  // won't convert
} else {
  // will convert
}

و ذلك لفترة طويلة ، وما إلى ذلك.

(مزدوج)x سيتم تحويل x من int إلى مضاعفة.على (الباحث) ثم يحوله مرة أخرى.حتى (int)(مزدوج)x تحويل شكل الباحث إلى مضاعفة ومن ثم العودة.أساسا رمز التحقق من أن التحويل إلى ضعف عكسها (وبالتالي أن ضعف يمكن تخزين القيمة الدقيقة الباحث).

نصائح أخرى

هذا يعتمد بشكل رئيسي على عدد مجموعة كنت تعمل مع.طالما أنت في غضون 15 أرقام (على مزدوج), يجب أن تكون على الجانب الآمن على أرقام كاملة.

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

طالما رقمك < 2^53, كنت عادة ما تكون جيدة.

IEEE 754 مزدوجة لديها 52 بت العشري و أنت التحويل من/إلى عدد صحيح طويل/ لذلك من السهل جدا أن الاختبار.إذا كان صحيح تستهلك أقل من 52 بت ثم يجب أن تكون قابلة للتحويل دون مشكلة IEEE 754 مزدوجة.

أعتقد (أنا متأكد في حالة جافا ولكن ليس C# و كسول التحقق) أن الباحث هو 32 بت و طويل هو 64 بت.لذا بالتأكيد الباحث يمكن أن يصلح في مضاعفة دون أي مشكلة سواء توقع unsign.

بالنسبة ulong ، يمكنك ببساطة لو كل بت أعلى من 52th بت واحد مثل ((aULong && 0xFFF0000000000000) == 0).

لفترة طويلة, لديك لجعل علامة في الاعتبار.منذ فترة طويلة هو 2-تكملة ولكن IEEE754 ليست (فقط سالبة بت) ، تعتقد أنها آمنة فقط السرية السلبية طويلة الإيجابية (*-1) وتحقق مثل إيجابية.لذا, إذا كان طويل سلبية الوقت مع -1 الأولى (لا تفعل شيئا إيجابيا).ثم التحقق من ذلك مثل ulong.

ويساعد هذا الأمل.

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