PDA

View Full Version : ضرب دو عدد مثبت و نتیجه منفی



MNosouhi
جمعه 28 آذر 1399, 20:01 عصر
با سلام
یلداتون مبارک
دوستان در کد زیر ، چرا حاصل ضرب دو عدد مثبت ، مقدار منفی می شه ؟:متفکر:


var Temp:Real;
Num1,Num2:integer;
begin
Num1:=1000;
Num2:=2795204;
Temp:=Num1*Num2;
ShowMessage('Temp:'+FloatToStr(Temp));
end;

152684

همانطور که در تصویر می بینید نتیجه را عدد منفی بر می گرداند در صورتی که باید مقدار ۲۷۹۵۲۰۴۰۰۰ برگرداند .

یوسف زالی
شنبه 29 آذر 1399, 01:42 صبح
وقتی دارید دو عدد اینت رو در هم ضرب می کنید، جواب شما نباید بالاتر از رنج بزرگترین تایپ محاسبات جاری باشه، دلفی فرض می گیره جوابتون هم اینته و اینی می شه که دیدید.
این رو امتحان کنید:


Temp := 1.0 * Num1 * Num2;

MNosouhi
شنبه 29 آذر 1399, 07:06 صبح
متشکر از پاسختون


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

این جواب منطقی نیست. اگر جواب واقعا همینی باشه که شما فرمودید ، همیشه (جهت احتیاط) در عملیات های شامل ضرب ، باید عبارت را در 1.0 ضرب کنیم ، چون ممکنه که عدد از رنج integer خارج بشه. یعنی دلفی اینقدر هوشمند نیست که مسئله به این سادگی را تشخیص بده. به نظرم مهم اینه که حاصلضرب از رنج معتبر مقصد (real) خارج نشه .
سوال دیگه اینکه اگر Temp به جای real از نوع int64 باشه باید چگونه عمل کرد ؟



var Temp:Int64;
Num1,Num2:integer;
begin
Num1:=1000;
Num2:=2795204;
Temp:=Num1*Num2;
ShowMessage('Temp:'+FloatToStr(Temp));

یوسف زالی
شنبه 29 آذر 1399, 12:41 عصر
دلفی و زبان های دیگه ای که باهاش برخورد داشتم معمولا همین طورند، اول محاسبات رو انجام می دن بعد می ریزن تو مقصد، همونطور که در نمونه اولیه هم دیدید محاسبات از اینت زده بود بالاتر ولی از ریل بالاتر نبود.
در محاسباتی که خروجی بزرگتر از ورودی می خواهید، حتما یکی از ورودی هاتون رو باید بزرگ بگیرید، این مورد مشخصا روی نوع بایت هم وجود داره، مخصوصا برای تبدیلات بایتی و کدگذاری کردن یک متن.
برای نمونه من روی اس کیو ال هم تست گرفتم و نتیجه مورد دار بود.

در نمونه شما:



var Temp:Int64;
Num1,Num2:integer;
begin
Num1:=1000;
Num2:=2795204;
Temp:=Int64(1) * Num1*Num2;
ShowMessage('Temp:'+FloatToStr(Temp));
end;

MNosouhi
شنبه 29 آذر 1399, 19:53 عصر
بسیار ممنون و مشکر

pe32_64
شنبه 29 آذر 1399, 21:52 عصر
بسیار ممنون و مشکر
سلام
اعداد علامت دار و بدون علامت ، هم چنین مبحث سرریز رو مطاله بفرمایید.