View Full Version : بدست آوردن عدد در محدوده کوادریلیون
persia_hrn
پنج شنبه 24 مرداد 1392, 00:19 صبح
سلام دوستان
من میخوام عددهای محدوده 1 تا 999 کوادریلیون که معادل 1,000,000,000,000,000,000 تا 999,999,999,999,999,999,999 هست رو با متغیر Extended بدست بیارم ولی تا 999 تریلیون (999,999,999,999,999,999) مشکل نداره و تا به یک کوادریلیون میرسه میشه 1.11111111111111111E18
کسی راهی بلده ؟ :افسرده:
من از این راه استفاده کردم .
var CalcValue: Extended;
CalcValue:=1000000000000000000;
Label1.Caption:=Format('%0.3f', [CalcValue]);
firststep
پنج شنبه 24 مرداد 1392, 01:06 صبح
دوست عزیز این رو یه نگاه بنداز ببینم کمک می کنه
کار (http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A&p=1289682&viewfull=1#post1289682)
persia_hrn
پنج شنبه 24 مرداد 1392, 01:31 صبح
دوست عزیزم FirstStep ممنون .
:گریه:
Ananas
پنج شنبه 24 مرداد 1392, 03:08 صبح
با IntX حتما میتونی :
http://barnamenevis.org/showthread.php?370537-%D8%B3%D9%88%D8%B1%D8%B3-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D8%A7%D8%AA-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B5%D8%AD%DB%8C%D8%AD-%D8%A8%D8%B2%D8%B1%DA%AF%D8%AA%D8%B1-%D8%A7%D8%B2-64-%D8%A8%DB%8C%D8%AA
persia_hrn
پنج شنبه 24 مرداد 1392, 03:53 صبح
سلام دوست من ، دستتون درد نکنه یونیتی که نوشتید رو دیدم ولی کامپایل که میکنم Int8 , Int16 , Int32 و ... برای دلفی من نامفهومه !
احتمالاً ورژن دلفی شما از من بالاتره .
باز هم ممنون .
Ananas
پنج شنبه 24 مرداد 1392, 04:00 صبح
سلام.
داخل یونیت System تعریف شده :
{ Useful alias types }
type
{$NODEFINE Int8} // We map 'Shortint' to 'Int8' for C++ above
Int8 = ShortInt;
Int16 = SmallInt;
Int32 = Integer;
IntPtr = NativeInt;
UInt8 = Byte;
UInt16 = Word;
UInt32 = Cardinal;
UIntPtr = NativeUInt;
persia_hrn
پنج شنبه 24 مرداد 1392, 04:13 صبح
متوجه نشدم !
چی شد ؟
:متفکر:
مهندس یه جوری توضیح بدین انگار میخواین به بچه دبستانی یاد بدید :لبخند:
hassan_reza
پنج شنبه 24 مرداد 1392, 05:51 صبح
منظورشون اینه که اگه یونیت system رو use نکردید، اون رو use کنید وگرنه در فایل سیستم خودتون، ببینید چنین تعریفی اگه نشده خودتون اون رو در برنامه تون تعریف کنید.
persia_hrn
پنج شنبه 24 مرداد 1392, 06:09 صبح
مشکل اینجاست که وقتی توی یونیت ها کلمه System رو میزنم Error میده !
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, System;
اینم Error :
[Error] Unit1.pas(6): Identifier redeclared: 'System'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
یوسف زالی
پنج شنبه 24 مرداد 1392, 10:39 صبح
آقا شما چرا؟
یونیت سیستم تنها یونیتیه که خودش یوزه و شما با یوز کردنش با خطا مواجه می شید.
persia_hrn
پنج شنبه 24 مرداد 1392, 11:38 صبح
آقا یوسف شما نمیدونید چرا دلفی 5 ، Int8 , Int16 و ... رو نمیشناسه ؟
احتمالاً این تعاریف توی ورژن های پایین دلفی وجود نداره ، درست میگم ؟
Ananas
پنج شنبه 24 مرداد 1392, 13:32 عصر
آقا!!!!!!!!!!! تعریفشو برات نوشتم دیگه! :
Int8 = ShortInt;
Int16 = SmallInt;
Int32 = Integer;
UInt8 = Byte;
UInt16 = Word;
UInt32 = Cardinal;
اگه یونیت سیستم شما اینارو نمیشناسه کافیه خودت اینارو کپی کنی تو فایل IntX.pas
Ananas
پنج شنبه 24 مرداد 1392, 13:48 عصر
این مدلی هم میشه تعریف کرد:
type
Int8 = -128.. 127;
Int16 = -32768..32767;
Int32 = -2147483648..2147483647;
persia_hrn
پنج شنبه 24 مرداد 1392, 14:34 عصر
وووووواااااااااییییییی چه فولی کردم !!!!!!!!!!!!!!!!!!!! :لبخند:
گفتم که بچه دبستانی :خجالت:
Ananas
پنج شنبه 24 مرداد 1392, 14:55 عصر
پس احتمالا طریقه ی استفادشم لازم بشه مثال بزنم:
یک تایمر با Interval = 1 روی فرم بگذارید :
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls,
IntX; // =======================
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ix : TIntX128; // =============================
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
IntX_FromStr(@ix, SizeOf(ix), '1000000000000'); //=====================
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IntX_Inc(@ix, @ix, SizeOf(ix), 1); //======================
Self.Caption := IntX_ToStr(@ix, SizeOf(ix)); //======================
end;
end.
من اینجا سایز ix رو 128 گرفتم که میتونید بیشتر هم بگزارید اگه خواستید. ولی عدد شما رو جواب میده.
بعد هم اعداد بین 1,000,000,000,000,000,000 تا 999,999,999,999,999,999,999 رو می خوای پیدا کنی می دونی چقدر طول میکشه؟!!!!!!!!!!!!!!!!!!!!
میدونی چند تاس؟ این تعدادشونه : 998,999,999,999,999,999,999
می خوای این همه عدد رو کجابنویسی؟ کجا نمایش بدی؟ یه حلقه به این تعداد کلی طول میکشه ها!
persia_hrn
پنج شنبه 24 مرداد 1392, 20:24 عصر
سلام و تشکر دوباره از شما دوست عزیزم ،
من دارم یه برنامه شبه حسابداری با امکانات ویژه مینویسم که اینجا جای توضیح درموردش نیست .
از اونجایی که این نرم افزار رو اختصاصی برای جایی مینویسم که با ارقام خیلی بزرگ کار میکنن مجبورم از محدوده کوادریلیون برای محاسباتشون استفاده کنم و الان توی این مرحله گیر کردم .
اون روالی هم که شما برام مثال زدید رو امتحان کردم ولی برای کامپایل فایل IntX.Pas با یه عالمه Error مواجه شدم و دروغ هم نگم ، نه وقت داشتم که ببینم مشکلش کجاست و نه خیلی سردرمیاوردم .
الان تمرکز کردم رو اینکه اعمال ریاضی رو روی رشته های String شبیه سازی کنم و با تیکه کردن و به هم چسبوندنشون اعدادی در اون سطح رو تهیه کنم ، البته نمیدونم بشه یا نه ولی راه های دیگه ای که به ذهنم رسید عملی نشد .
این نمونه که من از کار شما گرفتم رو گذاشتم ببینید مشکلش کجاست که اینهمه Error میده ؟
109144
اینم لیست Errorها :
[Error] IntX.pas(139): ',' or ')' expected but '=' found
[Error] IntX.pas(140): ',' or ')' expected but '=' found
[Error] IntX.pas(141): ',' or ')' expected but '=' found
[Error] IntX.pas(142): ',' or ')' expected but '=' found
[Error] IntX.pas(145): Incompatible types: 'Array' and 'String'
[Error] IntX.pas(151): Undeclared identifier: 'NativeInt'
[Error] IntX.pas(228): Invalid compiler directive: 'POINTERMATH'
[Error] IntX.pas(233): Array type required
[Error] IntX.pas(235): Array type required
[Error] IntX.pas(247): Operator not applicable to this operand type
[Error] IntX.pas(250): Array type required
[Error] IntX.pas(250): Array type required
[Error] IntX.pas(253): Array type required
[Error] IntX.pas(253): Array type required
[Error] IntX.pas(266): Array type required
[Warning] IntX.pas(270): Comparing signed and unsigned types - widened both operands
[Error] IntX.pas(274): Operator not applicable to this operand type
[Error] IntX.pas(277): Array type required
[Error] IntX.pas(277): Array type required
[Error] IntX.pas(280): Array type required
[Error] IntX.pas(280): Array type required
[Error] IntX.pas(283): Array type required
[Error] IntX.pas(299): Array type required
[Error] IntX.pas(301): Array type required
[Error] IntX.pas(377): Array type required
[Error] IntX.pas(384): Array type required
[Error] IntX.pas(396): Array type required
[Error] IntX.pas(396): Array type required
[Error] IntX.pas(396): Array type required
[Error] IntX.pas(404): Array type required
[Error] IntX.pas(404): Array type required
[Error] IntX.pas(404): Array type required
[Error] IntX.pas(412): Array type required
[Error] IntX.pas(412): Array type required
[Error] IntX.pas(412): Array type required
[Error] IntX.pas(420): Array type required
[Error] IntX.pas(420): Array type required
[Error] IntX.pas(436): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(441): Array type required
[Error] IntX.pas(443): Array type required
[Error] IntX.pas(444): Array type required
[Error] IntX.pas(447): Array type required
[Error] IntX.pas(448): Array type required
[Error] IntX.pas(466): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(471): Array type required
[Error] IntX.pas(472): Array type required
[Error] IntX.pas(476): Array type required
[Error] IntX.pas(493): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(497): Array type required
[Error] IntX.pas(498): Array type required
[Error] IntX.pas(511): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(515): Array type required
[Error] IntX.pas(516): Array type required
[Error] IntX.pas(531): Array type required
[Error] IntX.pas(537): Array type required
[Error] IntX.pas(546): Array type required
[Error] IntX.pas(562): Array type required
[Error] IntX.pas(563): Array type required
[Error] IntX.pas(610): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(614): Array type required
[Error] IntX.pas(615): Array type required
[Error] IntX.pas(616): Array type required
[Error] IntX.pas(627): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(638): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(653): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(661): Array type required
[Error] IntX.pas(692): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(737): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(792): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(807): Array type required
[Error] IntX.pas(841): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(845): Array type required
[Error] IntX.pas(847): Array type required
[Error] IntX.pas(866): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(872): Array type required
[Error] IntX.pas(888): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(927): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(933): Incompatible types: 'WideChar' and 'Char'
[Error] IntX.pas(951): Undeclared identifier: 'AllocMem'
[Error] IntX.pas(966): Invalid compiler directive: 'POINTERMATH'
[Fatal Error] Unit1.pas(6): Could not compile used unit 'IntX.pas'
دوست گلم از اینکه وقت برام گذاشتی ممنونم .
یوسف زالی
پنج شنبه 24 مرداد 1392, 20:50 عصر
اگر عدد اعشاری نیست چرا از Comp یا Cardinal یا LongWord یا LongInt استفاده نمی کنید؟
persia_hrn
پنج شنبه 24 مرداد 1392, 21:01 عصر
مشکل اینجاست که باید اعشاری باشه و Extended و Comp هردوتاشون تا به 1 کوادریلیون میرسن از حالت اصلی نمایش اعداد خارج میشن و با 1E18 نمایش داده میشن .
یوسف زالی
پنج شنبه 24 مرداد 1392, 21:22 عصر
برای نمایش می تونید از فرمت استفاده کنید. مهم نیست. مهم خود محاسباته. در پست قبل ترتون این موضوع اشاره شده بوده.
برای نمایش مشکل خاصی بوجود نمیاد. می تونید حتی در هنگام نمایش یک رشته تبدیل شده رو نمایش بدید.
persia_hrn
پنج شنبه 24 مرداد 1392, 22:12 عصر
آقا یوسف با دستور زیر هم درست نمیشه :
var CalcValue: Extended;
CalcValue:=1000000000000000000;
Label1.Caption:=Format('%0.3f', [CalcValue]);
جوابش میشه 1.11111111111E18 :افسرده:
یوسف زالی
پنج شنبه 24 مرداد 1392, 23:20 عصر
خب خودتون تابع تبدیل این اعداد بزرگ رو به رشته بنویسید. خیلی سخت نیست.
Ananas
پنج شنبه 24 مرداد 1392, 23:23 عصر
سلام.
ورژن دلفیتون پایینه. این ارور ها به خاطر اینه.
ولی اگر می خوای چیزی مشابه بنویسید به نظر من از string استفاده نکنید. سرعت پایینی داره. این روشی که من استفاده کردم هم حجمش کمه هم سرعتش بهتره. باز هم استفاده از array سرعتش بهتر از string هست (آرایه ای از رقم ها).
persia_hrn
پنج شنبه 24 مرداد 1392, 23:41 عصر
سلام دوست من ،
دیشب تا صبح روی آرایه ارقام کار کردم ولی یه مشکل عمدش اینه که Length یه آرایه 21 خونه ای همیشه 21 هست حتی اگه هیچ عددی توش وارد نشده باشه ولی String این مشکل رو نداره و خیلی راحت میشه تشخیص داد که چند کاراکتر درونش وارد شده .
zidane
شنبه 26 مرداد 1392, 13:44 عصر
سلام دوست من ،
دیشب تا صبح روی آرایه ارقام کار کردم ولی یه مشکل عمدش اینه که Length یه آرایه 21 خونه ای همیشه 21 هست حتی اگه هیچ عددی توش وارد نشده باشه ولی String این مشکل رو نداره و خیلی راحت میشه تشخیص داد که چند کاراکتر درونش وارد شده .
شما می تونید آرایه رو بدون طول تعریف کنید و در هر جای برنامه با SetLength طولش رو مشخص کنید
یوسف زالی
شنبه 26 مرداد 1392, 14:15 عصر
و البته خیلی کند تره
یوسف زالی
سه شنبه 29 مرداد 1392, 22:35 عصر
این رو ببین:
http://www.delphiforfun.org/Programs/Library/bigfloat.htm
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.