سؤال

فضولي فقط! لكنني رصدت أن قيمة π التي تحتفظ بها SAS هي في الواقع غير صحيحة.

على سبيل المثال:

data _null_;
x= constant('pi') * 1000000000000000000000000000;
put x= 32.;
run;

يعطي قيمة π (3.) 141592653589792961327005696

ومع ذلك - π بالطبع (3.) 1415926535897932384626433832795 ( http://www.joyofpi.com/pi.html. ) - إلى 31 موانئ دبي.

ما يعطي؟؟!!

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

المحلول

SAS Stores PI كمستمر إلى 14 مكان عشري. الفرق الذي تراه هو قطعة أثرية من الرياضيات العائمة عندما قمت بخطوة الضرب.

data _null_;
    pi=constant("PI");
    put pi= 32.30;
run;

/ * على السجل * /

pi=3.141592653589790000000000000000

نصائح أخرى

يتم عقد PI ثابتا في جميع لغات البرمجة في الدقة المحددة. لا يتم حسابها. الكود الخاص بك يكشف فقط مدى دقة بي في SAS.

حصلت على 16 رقما من الدقة. مما يعني أنه ربما يستخدم IEEE 754 تمثيل نقطة عائمة مزدوجة الدقة, ، والتي تعطي فقط حوالي 16-17 رقما عشريا من الدقة. من المستحيل أن يتم تمثيل π في أي عدد محدود من الأرقام، لذلك سيتم اقتطاع أي تمثيل كمبيوتر في عدد من الأرقام. هناك طرق للقيام بالرياضيات التعسفية الدقة (جافا لديها فئة بيئة كبيرة)، ولكن حتى ذلك الحين يجب عليك اقتطاع π في مكان ما. والرياضيات التي تم القيام به بهذه الطريقة هو عدة أوامر من حجم أبطأ (لأنه لا يتم التعامل معها بواسطة تعليمات CPU المباشرة).

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

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