لماذا لا يمكن للنظام العثور على طريقة biginteger.todouble؟
-
19-09-2019 - |
سؤال
أنا أستخدم 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