PDA

View Full Version : متغیر اعشاری



Saeid59_m
دوشنبه 16 تیر 1393, 00:03 صبح
چرا عبارت Hello در کد زیر چاپ نمی شود ؟




Var
C:Real;
begin
C:=1.1;
If (C = 1.1) Then Showmessage ('Hello');
end;

hadisalahi2
دوشنبه 16 تیر 1393, 09:12 صبح
خوب چون شرط if برقرار نمیشه
خط به خط اگه اجرا کنی متوجه میشی اون مقدار داخل متغیری که ریختی نیست.

بعضی مواقع حالا نمیدونم به چه علت ، دلفی اعداد اعشاری رو گرد میکنه
یک دسترو فرمت بندی مقادیر اعشاری هستش ، الان دقیقا یادم نیست چیه
با اون مقدار رو داخل متغیر بریز ببین جواب میده.

Saeid59_m
دوشنبه 16 تیر 1393, 21:43 عصر
ببین اگه این متغیر رو چاپ کنی می بینی که مقدار درسته



Var
C:Real;
Begin
C:=1.1;
ShowMessage (FloatTostr (C));
End;

rahnema1
دوشنبه 16 تیر 1393, 23:34 عصر
سلام
باید تبدیل یا cast به صورت صریح انجام بشه

If (C =Real( 1.1)) Then Showmessage ('Hello');

یوسف زالی
دوشنبه 16 تیر 1393, 23:46 عصر
با استفاده ا توابع Variant یا توابع یونیت Math می تونید این ممیز شناور رو مقایسه درست کنید.

مثلا با CompareValue
یا با استفاده از کدی شبیه این:
if abs(A - B) < epsillon then

Saeid59_m
چهارشنبه 18 تیر 1393, 00:36 صبح
با استفاده ا توابع Variant یا توابع یونیت Math می تونید این ممیز شناور رو مقایسه درست کنید.

مثلا با CompareValue
یا با استفاده از کدی شبیه این:
if abs(A - B) < epsillon then

درسته You-See جان ، اینو می دونم . به سورس تابع CompareValue هم نگاه کردم و متوجه شدم این مشکل فقط زمانی که می خواهی مقایسه تساوی کنی پیش می یاد . اما واقعاً چرا اینطوریه ؟؟!!

یوسف زالی
چهارشنبه 18 تیر 1393, 01:32 صبح
دلیلش برمی گرده به پیاده سازی ممیز شناور در کامپایلر.
بعضی اعداد از یک مبنا وقتی تبدیل به مبنای دیگه می شن، بصورت ادامه دار در میان، مثلا عدد 1.1 در مبنای 2 می شه ...1.0001100110011001100 (اگر اشتباه نکرده باشم)
حالا همین عدد در مبنای 10 می شه 1.0999999 !!
خب این به این دلیله که تعداد بایت های حافظه برای نگهداری این عدد بی نهایت نیست و اون آخر گرد میشه.
در این مقایسه هم، احتمال داره نوعی که کامپایلر می گیره برای اعداد هارد کد، با نوع مشخص شده شما یکی نباشه، بنابراین گرد شدن در طولهای متفاوت رخ می ده و دو عدد اندکی به اختلاف می خورند.

Saeid59_m
پنج شنبه 19 تیر 1393, 00:42 صبح
اما توی C# این مشکل وجود نداره ! :ناراحت:

یوسف زالی
پنج شنبه 19 تیر 1393, 04:20 صبح
اما توی سی شارپ رو از خودشون جویا شو!
دلیلش این می تونه باشه که نوع پیش فرض رو انتخاب کردید.
مثلا در همین دلفی به جای real انواعی مثل Extended رو تست کنید با یکیشون باید مشکلی نباشه. همچنین در سی شارپ با یکیشون باید مشکل باشه مثلا double float

rahnema1
پنج شنبه 19 تیر 1393, 05:02 صبح
اما توی C# این مشکل وجود نداره ! :ناراحت:

در سی شارپ هم همین طوره
شما وقتی یک ثابت اعشاری را در دلفی به صورت مثلا 1.1 می نویسید به طور پیش فرض نوع Extended را برای اون در نظر می گیره.
در سی شارپ نوع double در نظر می گیره
این مثال سی شارپ را اجرا کنید ببینید همه اینها از یه استاندارد IEEE تبعیت می کنند

using System;
class Test
{
static void Main() {
float C=1.1f;
if(C == 1.1)
Console.WriteLine(C.ToString());
}
}