PDA

View Full Version : دلیل خروجی و نامساوی بودن 2 جواب



fshb_ 1370
شنبه 16 مرداد 1389, 10:10 صبح
سلام
در برنامه زیر 3/10 برابر 3.3333333333333 میشه. جواب tube هم 3.333333 نمایش داده میشه، اما milion tubs را 3333333.250000 نمایش میدهد. چرا؟ مگه 6^10*3.333333 در جوابش 2 یا 5 داره؟
چرا جواب mint*milion با جواب tub*milion فرق داره؟ مگه نباید جواب هر دو یکی باشه؟

کد
cout.setf(ios_base::fixed, ios_base::floatfield);
باعث میشه عدد تا 6 رقم اعشار نمایش داده بشه؟

کد برنامه:


#include <iostream>
using namespace std;
int main()
{
cout.setf(ios_base::fixed, ios_base::floatfield); // fixed-point
float tub = 10.0 / 3.0; // good to about 6 places
double mint = 10.0 / 3.0; // good to about 15 places
const float million = 1.0e6;
cout << "tub = " << tub;
cout << ", a million tubs = " << million * tub;
cout << ",\nand ten million tubs = ";
cout << 10 * million * tub << "\n";
cout << "mint = " << mint << " and a million mints = ";
cout << million * mint << "\n";
return 0;
}

خروجی برنامه:
tub = 3.333333, a million tubs = 3333333.250000,

and ten million tubs = 33333332.000000

mint = 3.333333 and a million mints = 3333333.333333

PC2st
شنبه 16 مرداد 1389, 11:21 صبح
چونکه نوع float به اندازهٔ کافی بزرگ نیست. در این محاسبات، بعضی ارقام اعشاری از بین می‌رود. شما باید از نوع double به جای float استفاده کنید، یا اینکه می‌توانید در حین محاسبات، یکی از آنها را double کنید تا در نهایت، نتیجه برای نوع double محاسبه شود:


cout << 10 * million * tub << "\n";
در اینجا با اعشاری کردن 10.0، نوع آن double می‌شود (به جای int) و نتیجه درست خواهد شد. یا اینکه بصورت زیر عمل تبدیل را انجام دهید:


cout << 10 * (double)million * tub << "\n";

fshb_ 1370
شنبه 16 مرداد 1389, 12:34 عصر
ممنون از توضیحتون.
میشه در مورد این کد هم توضیح بدید.

cout.setf(ios_base::fixed, ios_base::floatfield);

PC2st
شنبه 16 مرداد 1389, 14:22 عصر
اگر سوال شما در رابطه با تاثیر آن است؛ این تابع دو پارامتر می‌گیرد، دومین پارامتر بعنوان mask عمل می‌کند (برای setکردن flagهای غیر مستقل تا لزومی به استفاده ترکیبی unsetf و setf نباشد) و در اینجا mask برای تغییر نحوهٔ نمایش ممیز شناور تنظیم شده و باعث می‌شود که ارقام اعشاری ممیز شناور بصورت ثابت نمایش داده شوند (همهٔ صفرها هم نمایش داده شود). در غیر اینصورت، ارقام آن بصورت علمی (scientific) نمایش داده می‌شود.

بهتر است برای موارد کوچک (مثل همین مثال شما)،
از stream manipulatorها (فایل سرآیند iomanip) به جای این تابع استفاده کنید: cout << fixed