View Full Version : float128 و اعداد اعشاری با دقت 32 رقمی
Ananas
پنج شنبه 02 شهریور 1391, 13:42 عصر
سلام به دوستان بزرگوار.
یه مسئله ای هست که مدت هاست که دوست دارم بدونم و ازش استفاده کنم. تو c++ چطور از اعداد اعشاری با دقت 32 رقم، مثل ماشین حساب ویندوز، میشه استفاده کرد؟
که احتمالا هم باید 128 بیتی باشن.
من تو بعضی از سایت ها دیدم که برنامه هایی نوشتن و از float128 استفاده کردن ولی متوجه شدم که برنامه ی نوشته شده برای محیط لینوکس بوده. به نظرتون برای ویندوز چطور میشه این کار رو کرد؟
دقت کنید من نمی خوام ماشین حسابی بسازم که ارقام بزرگ رو پشتیبانی کنه و من ماشین حسابی هم ساختم که تا 10000 رقم اعشار هم محاسبات انجام میده (با دلفی) ولی برای float128 منظورم اینه که مستقیما با سخت افزار محاسبات انجام بشه و فکر میکنم ماشین حساب ویندوز هم به همین طریق هست (که سرعتشم زیاد میشه مشابه double ولی یکمی کند تر) وگرنه ماشین حساب ویندوز قابلیت تعیین تعداد ارقام رو براش میگذاشت مثل ماشین حساب های بزرگ دیگه که هست. و فکر میکنم که سخت cpu ها توان محاسبه ی اعشار 128 بیتی رو داشته باشن نه اینکه با روش نرم افزاری مثل تکنیک های ضرب و تقسیم روی کاغذ بیایم با آرایه ها کار کنیم، حالا چطور میشه برنامه ای به این شکل نوشت؟
فایل هدر خاصی رو میشناسید که تو محیط ویندوز جواب بده؟
یه چیزی هم خوندم و دوستان گفتن به اسم sse که دقیقا نمیدونم مربوط به همین هست یا نه. معمولا میگن 128 بیتی ولی شاید sse به شکل برداری 4 تایی از اعداد float 32 بیتی باشه. لطفا راهنمایی کنید.
tdkhakpur
پنج شنبه 02 شهریور 1391, 14:18 عصر
برای 64 بیت تعریف مستقیم داره
__int64 a=123456789, b=1234567890123456, res;
res = a*b;
اما 128 باید از ساختارها استفاده کنی به نظرم یه ذره رو الگوریتم کارش تحقیق کنید با همین ساختار راه سریعتری وجود داشته باشیه.
typedef struct _int128 {
__int64 Low;
__int64 High;
} _int128;
Ananas
پنج شنبه 02 شهریور 1391, 15:15 عصر
برای 64 بیتی که خوب همونطور گه گفتید __int64 برای اعداد صحیح و هم double برای اعداد اعشاری و long double هم که 80 بیتی هست. برای 128 بیتی هم همینطوره که می گید از ساختارها استفاده میشه ولی مشکل توابعی هست که مثلا از این ساختار لگاریتم و یا سینوس بگیره منظورم توابع ریاضی که برای اعداد حقیقی استفاده میشه محاسبات به اصطلاح float point و اعشاری رو می خوام. من احتیاج به فایل هدر تعریف شده و یا تکنیکی که خودم این کار رو بکنم (ترجیحا به نظرم فایل هدرش رو بشه پیدا کرد) دارم که اعمال محاسباتی و ریاضی رو روی این ساختار انجام بده.
تو c++ استاندارد همچین چیزی وجود نداره؟
شاید .net همچین چیزی داشته باشه ولی می خوام وابسته به .net نباشه.
ببینید من دنبال همچین چیزی هستم :
http://c-cpp.r3dcode.com/files/gcc/4/6.2/libquadmath/quadmath.h
ولی دقیقا نمی دونم برای استفاده ازش چه چیز لازمه و آیا تو ویندوز هم کار میکنه؟
الان اگه من بخوام از quadmath.h استفاده کنم باید چه چیزهای دیگه ای رو از این آدرس دانلود کنم؟
و اینکه اونجا نوشته gcc مربوط به لینوکسه؟ الان داخل کد رو ببینیی وقتی عدد رو نوشته آخرش از Q استفاده کرده مثل long double که آخرش L می گذاریم و یا float که آخرش f می گذاری، حالا اگه از کامپایلر برلند یا vs استفاده کنم چطور این Q رو میشناسه؟
#target
پنج شنبه 02 شهریور 1391, 15:18 عصر
از همونSIMD و AVX میشه
باید سی پی یو پشتیبانی هم کنه البته
فایل هدر مربوطه immintrin.h هست . هنوز تست نکردم چطور رفتار میکنه
Ananas
پنج شنبه 02 شهریور 1391, 15:40 عصر
این قسمت توابع ریاضیش هست. از عبارت kernel تو سورس کدهاش استفاده کرده نمیدونم منظورش چیه؟ فقط یه جور نامگذاریه؟
http://c-cpp.r3dcode.com/folders/gcc/4/6.2/libquadmath/math
Ananas
پنج شنبه 02 شهریور 1391, 15:53 عصر
از همونSIMD و AVX میشه چی هستن اینا؟ لطفا بیشتر توضیح بده.
باید سی پی یو پشتیبانی هم کنه البته به نظرم خیلی از cpu ها که الان استفاده میشن پشتیبانی کنن چون تو سیستم های قدیمی با ویندوز های قدیمی هم من دیدم ماشین حساب ویندوز همون طور 32 رقمی کار میکنه.
فایل هدر مربوطه immintrin.h هست . هنوز تست نکردم چطور رفتار میکنه
آره الان یادم میاد چند روز پیش میگشتم این فایلم پیدا کردم که البته تو ویژوال استودیو هست و برلند نداره. داخل سورسش نوشته __m256 یعنی به نظرتون واقعا تا این حد؟:متعجب:
توابع جمع و ضرب و تقسیم و جذر و floor و این چیزا توش هست ولی توابع مثلثاتی توش ندیدم. البته همینا هم که باشه اون ها رو خیلی راحت میشه تعریف کرد. مهمترین ها جمع وتفریق و ضرب و تقسیم و جذر هستن که بقیه رو میشه از طریق اینها تعریف کرد.
__________________________________________
ولی فکر میکنم چیزی که می خوام immintrin.h نیست. مثل اینکه طراحی شده برای جمع و ضرب مجموعه ای از اعداد float32 بیتی که بیشتر برای بردار ها و ضرب های ماتریسی کاربرد داره و من هم از طریق فایل های هدر xna به نام xnamathmatrix.inl این فایل رو پیدا کرده بودم و بعد فهمیدم که (اگه درست فهمیده باشم) برای مجموعه ای از اعداده نه یک عدد بزرگ مثلا 128 بیتی.
مثلا همچین کاربردی داره :
http://stackoverflow.com/questions/6687535/unexpected-result-from-avx-m256-unpack-ps-unpack-intrinsic
#target
پنج شنبه 02 شهریور 1391, 17:11 عصر
آره این برای چیزی که شما میخواید نیست الان داشتم Intel Manual Reference رو نگاه میکردم که x87 FPU رجیسترهاش 80 بیتی هست پس بطور مستقیم نمیشه پیاده سازی 128 بیتی داشت مگر با استفاده از همون تکه کردن به دو بخش و ...
SIMD هم آره یک دستورو میاد برای تعدادی داده ها اجرا میکنه . مثلا اون 256 بیت میشه هشت تا float 32 بیتی که یک جا عملیات رو انجام میده ! (برای پردازش گرافیکی میشه برای بهینه سازی ازش استفاده کرد .دستور العمل های SSE و MMX و AVX برای همین کارا هستن )
amin1softco
پنج شنبه 02 شهریور 1391, 19:09 عصر
عجب بحث باحالی :دی
شاید این لینک ها مفید باشه :
http://msdn.microsoft.com/en-us/library/708ya3be%28v=VS.80%29.aspx
http://felix.abecassis.me/2011/09/cpp-getting-started-with-sse/
ولی آخرش همین quadmath فک کنم جواب شما باشه.
برای استفاده هم باید lib ها و هدر ها اضافه بشه احتمالاً تست نکردم.
tdkhakpur
پنج شنبه 02 شهریور 1391, 19:31 عصر
تو c++ استاندارد همچین چیزی وجود نداره؟
شاید .net همچین چیزی داشته باشه ولی می خوام وابسته به .net نباشه.
ببینید من دنبال همچین چیزی هستم :
http://c-cpp.r3dcode.com/files/gcc/4/6.2/libquadmath/quadmath.h
ولی دقیقا نمی دونم برای استفاده ازش چه چیز لازمه و آیا تو ویندوز هم کار میکنه؟
الان اگه من بخوام از quadmath.h استفاده کنم باید چه چیزهای دیگه ای رو از این آدرس دانلود کنم؟
و اینکه اونجا نوشته gcc مربوط به لینوکسه؟ الان داخل کد رو ببینیی وقتی عدد رو نوشته آخرش از Q استفاده کرده مثل long double که آخرش L می گذاریم و یا float که آخرش f می گذاری، حالا اگه از کامپایلر برلند یا vs استفاده کنم چطور این Q رو میشناسه؟
اصلا بحث این نیست که کی کجای و چطوری برنامه ای نوشته که 128 بیت رو توی cpu پردازش میکنه بحث اصلی اینجاست که همه این امکان رو ندارن که cpu شون همچین کاری انجام بده.
برای اینکه این مسئله برای شما جای سوال باقی نزاره تحقیق کنید که آیا هر cpu میتونه 128 رو تو رجیسترهای خودش نگه داره تا برای شما بتونه داخل cpu و با دو یا سه دونه کلاک پالس عمل ریاضی رو انجام بده.
در ضمن اون نمونه کدهایی رو که پیدا کردید به احتمال زیاد الگوریتم هستن و کد مستقیم برای cpu نیست.
amin1softco
پنج شنبه 02 شهریور 1391, 19:55 عصر
خوب همه کارت گرافیک که دارند و اونم با cuda از sse ساپورت می کنه ...
Ananas
پنج شنبه 02 شهریور 1391, 22:13 عصر
آره این برای چیزی که شما میخواید نیست الان داشتم Intel Manual Reference رو نگاه میکردم که x87 FPU رجیسترهاش 80 بیتی هست پس بطور مستقیم نمیشه پیاده سازی 128 بیتی داشت مگر با استفاده از همون تکه کردن به دو بخش و ... شاید رجیستر 128 بیتی تو cpu نباشه ولی شاید برای قسمت محاسبات اعشاری با اشاره گر اطلاعات رو بتونه ببره تو قسمت اعشاری و محاشبه کنه. من اطلاعاتم تو این قسمت کافی نیست و اینا از اون احتمالات تخ... هست که من همیشه میدم.
اصلا بحث این نیست که کی کجای و چطوری برنامه ای نوشته که 128 بیت رو توی cpu پردازش میکنه بحث اصلی اینجاست که همه این امکان رو ندارن که cpu شون همچین کاری انجام بده.
برای اینکه این مسئله برای شما جای سوال باقی نزاره تحقیق کنید که آیا هر cpu میتونه 128 رو تو رجیسترهای خودش نگه داره تا برای شما بتونه داخل cpu و با دو یا سه دونه کلاک پالس عمل ریاضی رو انجام بده.
در ضمن اون نمونه کدهایی رو که پیدا کردید به احتمال زیاد الگوریتم هستن و کد مستقیم برای cpu نیست. به نظرم مثال نمونه ماشین حساب ویندوزه. تو کدوم ویندوز دیدید که ماشین حسابش نتونه 32 رقم رو محاسبه کنه؟ شاید کاملا سخت افزاری نباشه یعنی عملیات اصلی مثل جمع و تفریق و ضرب و تقسیم و جذر رو انجام میده و بقیه رو باید فرمول نوشت. نمیدونم شایدم طوری هست که همش نرم افزاریه ولی با روش و تکنیک آرایه ها و ضرب و تقسیم تو مدرسه نیست. اگه دقت کرده باشید وقتی ماشین حساب ویندوز محاسباتش (مثل توان های بالا) طول میکشه وسط کار چند ثانیه که بگذره پیغام میده که می خوای ادامه بدی یا نه. پس احتمالا حلقه ی محاسبات توانیش نرم افزاری هست. به نظرم چیزی مثل همون آدرسی که گفتم quadmath فکر میکنم جواب بنده باشه فقط لطف کنید کمک کنید که چطور باید مثلا تو برلند یا vs استفاده بشه.
ولی آخرش همین quadmath فک کنم جواب شما باشه.
برای استفاده هم باید lib ها و هدر ها اضافه بشه احتمالاً تست نکردم.موافقم. من هنوز فرصت نکردم فایلاشو کامل دانلود کنم چون تیکه تیکه هست و دقیقا هم نمیدونم به کدوم قسمت ها احتیاج داریم. فکر میکنم همینطور که میگید lib ها و هدر فایل ها ولی کدومشون؟ همه رو؟
خوب همه کارت گرافیک که دارند و اونم با cuda از sse ساپورت می کنه ... همونطور که عرض کردم فکر میکنم sse برای بردار مثلا 4 تایی از اعداد اعشاری هست و برای یک عدد 128 بیتی انگار جواب نمیده. (البته هنوزم مطمئن نیستم که کاربرد دومش این نباشه)
#target
پنج شنبه 02 شهریور 1391, 23:06 عصر
شاید رجیستر 128 بیتی تو cpu نباشه ولی شاید برای قسمت محاسبات اعشاری با اشاره گر اطلاعات رو بتونه ببره تو قسمت اعشاری و محاشبه کنه.
اگه نشه تو رجیستر قرار داد نمیشه اونطور . چون سی پی یو که بخواد محاسبه رو انجام بده باید بیاد تو رجسیتر !
مگه اینکه بتونی عدد اعشاری بزرگ رو با استفاده الگوریتمی به قطعات 80 بیتی مثلا بشکنی بعد !
ماشین حساب ویندوز حتما با نرم افزار پیاده سازی کرده . (میشه اینو کشف کرد ! )
اگه دقت کرده باشید وقتی ماشین حساب ویندوز محاسباتش (مثل توان های بالا) طول میکشه وسط کار چند ثانیه که بگذره پیغام میده که می خوای ادامه بدی یا نه
چه جالب ؟ مثلا ؟؟ من ی توان خیلی بزرگ دادم گفت Invalid input کمتر دادم جواب داد یکی دیگه زدم نوشت Overflow ولی برا محاسبه هیچ مکثی نکرد !!
tdkhakpur
پنج شنبه 02 شهریور 1391, 23:59 عصر
خوب همه کارت گرافیک که دارند و اونم با cuda از sse ساپورت می کنه ...
نظرمون در مورد حالت کلی بحث هست نه اینکه به زور هم که شده کارمون رو انجام بدیم.
در هر صورت اگه کامپیوتر تون اینا رو میتونه پشتیبانی کنه این روش کدینگ سطح پایین برای استفاده از 128 بیت و یه سری کد مخصوص cpu باید باشه
typedef struct _int128 {
__int64 Low;
__int64 High;
} _int128;
_int128 k;
__asm
{
MOVUPS XMM0, [EAX]
MOVUPS XMM1, [EBX]
ADDPS XMM0, XMM1
MOVUPS [k], XMM0
}
اینجا (http://www.godevtool.com/TestbugHelp/XMMfpins.htm) هم لینک هست میتونید تعقیبش کنید.
Ananas
جمعه 03 شهریور 1391, 00:35 صبح
(میشه اینو کشف کرد ! )
یعنی چطوری؟
چه جالب ؟ مثلا ؟؟ من ی توان خیلی بزرگ دادم گفت Invalid input کمتر دادم جواب داد یکی دیگه زدم نوشت Overflow ولی برا محاسبه هیچ مکثی نکرد !!
راست میگی منم امتحان کردم نشد ولی من یادمه قبلا (شاید بیشتر از 2 سال پیش) من امتحان کرده بودم و اینطور میشد و شاید برای توان نبوده و برای فاکتوریل بوده ولی فکر میکنم بخاطر ورژن جدیدش تو ویندوز 7 هست که من تو ویندوز xp اینو دیده بودم یعنی سخت افزاری که این اتفاق توش افتاده بود شاید پشتیبانی نمیکرده و برنامه تشخیص میداده و از شبیه ساز نرم افزاری استفاده می کرده که سرعتش کمتر میشده. من یادمه بعضی وقتا اینقدر طولانی میشد که حین محاسبه چند دفعه این پیغام رو میداد که می خوای کنسلش کنم یا ادامه بدم. نمی دونم چون برای خیلی وقت پیشه شاید هم اشتباه یادم میاد.
اگه ماشین حساب ویندوز و یا همین quadmath نرم افزاری کار کنن پس فکر میکنم قائده و قانون ذخیره ی اعداد اعشاری به شکل باینری رو رعایت میکنن که برام جالبه بدونم قانونش چیه. منظورم اینه که مثل float و double اطلاعاتشون رو ذخیره میکنن ولی تو قالب 128 بیت. و همون کاری که تو سخت افزار انجام میشه همون بلا رو با نرم افزار روی بیت ها میارن. و فکر میکنم با آرایه کار نمیکنه. چون اگه اینطور بود حتما قابلیت افزایش ارقام رو بهش میداد.
#target
جمعه 03 شهریور 1391, 09:42 صبح
یعنی چطوری؟
با ابزار های تحلیل و مهندسی معکوس . مثل IDA Pro یا حتی دیباگرهایی مثل OllyDBG یا Immunity Debugger که سطح اسمبلی کار میکنن !
البته این کار یکی دو دقیقه نیست و ممکنه چند روز وقت بگیره
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.