واضح آرشیو وب فارسی:سایت ریسک: View Full Version : باگ در Visual Basic 6 Morteza 56112-03-2010, 07:25 PMمن این سوال رو هر جا که تونستم مطرح کردم ولی هنوز جوابی نگرفتم: چرا حاصل یه تفریق مثل نمونه زیر ادر Visual Basicشتباه در میاد؟ 1.9 - 1.99 می شود 9.00000000000001E-02 ممنون میشم زودتر جواب بدید. M i L @ D12-03-2010, 08:53 PMمن این سوال رو هر جا که تونستم مطرح کردم ولی هنوز جوابی نگرفتم: چرا حاصل یه تفریق مثل نمونه زیر ادر Visual Basicشتباه در میاد؟ 1.9 - 1.99 می شود 9.00000000000001E-02 ممنون میشم زودتر جواب بدید. وقتی متغیر از نوع Currency باشه ، جواب درست درمیاد ! ولی نمیدونم چرا با Single و Double این جواب رو میده ! _H2_12-03-2010, 09:49 PMسلام من که از VB 6 خوشم نمی آید ولی این مورد باگ نیست! در محیطهای دیگر هم وجود دارد. دلیلش هم فقط و فقط مربوط به تبدیلات مبنای دو (باینری) اعداد اعشاری میشود. اصولاً به همین دلیل است که برای موارد مالی در VB 6 نوع Currency و در VB 7,8,9,10 نوع Decimal را پیشنهاد میکنند. ( البته برای ما ایرانی ها به دلیل نداشتن اعشار در واحد پولی نوع Integer و Long در VB 7,8,9,10 کافی است. Integer در VB 7,8,9,10 برابر Long در VB 6 است! Long در VB 7,8,9,10 هیچ معادلی در VB 6 ندارد!! ) ===== همانطور که در مبنای 10 برای ارزش مکانی اعداد یکان و ده گان و صدگان و هزارگان و... داریم. در مبنای 2 هم برای ارزش مکانی اعداد یکان و دوگان و چهارگان و هشت گان و.... داریم. مثلاً عدد 0101در باینری میشود 5 چرا؟ یک یک در محل یگان دارد و یک یک هم در محل چهارگان دارد که میشود 5 ! ===== در ارزش مکانی زیر اعشار هم همین وضعیت را داریم ... یعنی در مبنای 10 ارزش مکانی یکدهم گان(!) و یکصدم و یک هزارم و... را داریم. در مبنای 2 هم ارزش مکانی یک دوم گان(!) و یک چهارم و یک هشتم و... را داریم. یعنی اعداد اعشاری شما باید به نوعی به جمع این ارزش مکانی های مبنای 2 تبدیل شود که همیشه امکان دقیق این کار وجود ندارد!!!! مشابه مشکل 10 تقسیم بر 3 در مبنای ده خودمان! که حاصلش میشود 3.33333333333333 و تعداد 3 ها تمامی ندارد ولی متغیر حافظه محدود است و تا تعداد ارقام خاصی را میتواند جا دهد! به نوعی شبیه این مشکل در مبنای 2 هم با شرایط خودش رخ میدهد و اعداد ما در مبنای 10 امکان دارد کامل و دقیق به مبنای دو تبدیل نشوند و یا محاسبات کمی با چیزی که ما از مبنای ده انتظار داریم تفاوت داشته باشد. ===== به همین دلایل هم است که مدام در منابع آنلاین/آفلاین مایکروسافت و کتوب معتبر تاکید میشود که متغییر های ممیز شناور را با هم مقایسه تساویر نکنید ... یعنی در کدتان جایی برای single و double ننویسید if x = y !!! چون به احتمال اینکه تساوی برقرار نشده و false باشد بسیار بیشتر خواهد بود. نوعهای اعشار را همواره باید با یک مقدار فاصله مطلوب از هم مقایسه کرد. if ABS(x-y)<0.001 (یعنی x و y اختلافی کمتر از یکهزارم داشته باشند) و... ===== ولی ساختار متغیر های Currency یا Decimal کاملاً Binary نیست. به این معنی که در این ساختارها عدد اصلی جداگانه Binary ذخیره میشود و توان علمی در مبنای 10 (نه 2!) هم جداگانه Binary میشود. موفق باشید. Morteza 56113-03-2010, 09:03 PMواقعا دست هر دو عزیز (Lee_Young_Ae2027 جان و _H2_ جان درد نکنه) وای که چقدر کشتم خودمو تا این جوابا رو بشنوم. باور کنید حداقل از بیست نفر این سوال رو پرسیده بودم ولی بی جواب مونده بود. واقعا از ته دل میگم: اجرکم عندالله... سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 337]