مطابقة FORTRAN التقريب في C#
-
05-07-2019 - |
سؤال
FORTRAN يوفر العديد من الوظائف لتحويل الدقة المزدوجة رقم لا يتجزأ القيمة.الطريقة المستخدمة الاقتطاع/التقريب يختلف.أنا تحويل العلمية المعقدة الخوارزميات التي تستخدم هذه.
وفقا FORTRAN الوثائق:
ليس(x) إرجاع قيمة التكامل بين x و 0 ، أقرب x.
anint(x) يعود لأقرب جزء لا يتجزأ من قيمة x, إلا نصف الحالات
تقريب إلى جزء لا يتجزأ من قيمة أكبر في الحجم.
nint(x) يحول x إلى الباحث تنسيق التقريب إلى أقرب الباحث القيمة ، باستثناء
في منتصف الطريق من الحالات يتم تقريب إلى الباحث قيمة أكبر في الحجم.
ولا يوجد أي تنفيذ هذه في C# ؟ قد يكون صعب الحصول على ذلك الحق.
(int) × يبدو أن المباراة ليس()
تحويل.ToInt32(x) لا يطابق أي من أعلاه.
Trunc(x) لا يطابق أي من أعلاه.
الجولة(x) قد تطابق anint أو nint.
الفرق بين anint و nint يبدو أن عودة النوع ، حيث anint ترجع الدقة المزدوجة القيمة ولكن nint بإرجاع عدد صحيح.وتستخدم على حد سواء (acutal العينة):
الدقة المزدوجة A, B, C, D, E, F, G
...مجموعة القيم هنا ...
F = ANINT(A-B) + ANINT(ج-د) + ANINT(B+D-E)
ز = NINT(F) + 1D0;
ربما FORTRAN الخبراء يمكن أن تساعد على توضيح لماذا اختار الكاتب إلى استخدام كل من (أنا على افتراض أنه كان متعمدا).
المحلول
من تعريفات المكالمات ، nint
و anint
يتم توفيرها من قبل Math.Round
باستخدام MidpointRounding.AwayFromZero
.
بالنسبة aint
, صريح من الزهر double
إلى int
تحقيق تلك النتيجة.
نصائح أخرى
من ما أستطيع أن أرى ، aint()
هو فقط Math.Floor()
.
عن اثنين آخرين ، أعتقد أنك الحق أن الفرق الوحيد هو عودة نوع: nint()
بإرجاع صحيح الفعلية ، في حين anint()
يعود مزدوجة (fortran:الحقيقي) الذي يحدث أن يكون جزءا لا يتجزأ القيمة.
يجب تنفيذ وظيفة anint ، اتبع التعليمات البرمجية:
double anint(double x)
{
int a;
double y;
a = (int)x; //a=9
if (10 * x - 10 * (double)a >= 5)
{
a = a + 1;
}
y = (double)a;
return y;
}