لماذا لا يمكن للنظام العثور على طريقة biginteger.todouble؟

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

سؤال

أنا أستخدم F # التفاعلية، وقد أضفت مرجع fsharp.powerpack.dll.

عندما أحاول تحويل الرمز إلى مضاعفة الكود التالي،

let n = 2N
let d = double n

خطأ يخرج ذلك

"system.missingmethodexception: الطريقة غير موجودة: 'system double system.numerics.biginteger.todouble (system.numerics.biginteger). في Microsoft.fsharp.math.bignum.todouble (bignum n)"

ماذا يمكنني أن أفعل إذا أردت إجراء مثل هذه التحويلات مثل "الرمائم إلى int" و "برعاية مزدوجة"؟ شكرا جزيلا.

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

المحلول

ما كتبته ستعمل في CTP # المستقل.

يحدث هذا الخطأ في VS2010، لأنه تم نقل نوع Biginteger من مكتبة F # إلى مكتبة .NET4.0 الأساسية. لست متأكدا مما إذا كانت هذه المسألة لديها شيء ما يجب القيام به مع تثبيت كل من F # CTP و VS2010 بيتا المثبتة.

حتى يأتي حل أفضل، يمكنك لفة التحويل الخاص بك مثل هذا:

let numToDouble (n:bignum) = double n.Numerator / double n.Denominator

لتحويل بريد إلى عدد صحيح، يمكنك التفكير في شيء مثل هذا:

let numToInt (n:bignum) = int n.Numerator / int n.Denominator

ولكن هذا أمر خطير إلى حد ما: سوف تفيض بسهولة تماما. سيكون إصدار أفضل من NumToint هو التحويل إلى OFFORT OFFORT ثم تحويل إلى INT:

let numToInt = int << numToDouble

ومع ذلك، فإن كلا التحويلين غير مثاليين للحملات / القوامين بأكثر من 308 رقما، والتي لا تزال تتجاوز مضاعفة، في حين أن الكسر نفسه قد يكون صغيرا.

على سبيل المثال: 11 ^ 300/13 ^ 280 ~ = 3.26337، ولكن

> numToDouble (pown 11N 300 / pown 13N 280);;
val it : float = nan
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top