رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران
rezaict

اعداد بزرگ با طول بی نهایت در Qt


پست های پیشنهاد شده

سلام. اگر بخوایم برای ضرب دو عدد با طول بی نهایت در یک ماشین حساب که در محیط QT ساخته شده است به شرطی که نتیجه ضرب را نشان دهد و overflow رخ ندهد، از چه کتاب خانه ای می توان استفاده کرد؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 17 ساعت قبل، rezaict گفته است :

سلام. اگر بخوایم برای ضرب دو عدد با طول بی نهایت در یک ماشین حساب که در محیط QT ساخته شده است به شرطی که نتیجه ضرب را نشان دهد و overflow رخ ندهد، از چه کتاب خانه ای می توان استفاده کرد؟

درود،با هدف بی‌نهایت که منطقی نیست به هر حال باید یک بازهٔ قابل پشتیبانی اعمال بشه.
این کتابخانه را بررسی کنید.

#include "BigInt.hpp"
/////


BigInt big1 = 1234567890, big2;
big2 = "9876543210123456789098765432101234567890";

std::cout << big1 * big2 * 123456 << "\n";
// Output: 1505331490682966620443288524512589666204282352096057600

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
ارسال شده در (ویرایش شده)

ممنونم از پاسختون

جسارتا موقعی که اجراش میکنم با ارور مواجه میشم (من دارم از حالت widget application در QT استفاده میکنم. شاید به خاطر این باشه که از حالت console استفاده نمیکنم)

 

error: multiple definition of `is_valid_number(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
debug/calculator.o: In function `ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type':

ویرایش شده در توسط rezaict
ناقص بودن اطلاعات

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 2 ساعت قبل، rezaict گفته است :

ممنونم از پاسختون

جسارتا موقعی که اجراش میکنم با ارور مواجه میشم (من دارم از حالت widget application در QT استفاده میکنم. شاید به خاطر این باشه که از حالت console استفاده نمیکنم)

 

error: multiple definition of `is_valid_number(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
debug/calculator.o: In function `ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type':

بنده روی Qt Widget و STL آزمایش کردم، مشکلی نداره و اجرا می‌شه.

خطایی که ارسال کردین اشاره به باز‌تعریف is_valid_number داره، بررسی کنید که تکرار در تعریف تابع وجود نداشته باشه.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

آها ببخشین من کتابخانه رو به صورت <> تعریف کرده بودم در صورتیکه باید توی کوتیشن بود. ولی با این حال هیچ تفاوتی نکرد وقتی طول اعداد بزرگ باشه حاصلضرب رو کامل نمایش نمیده و به صورت عدد e خلاصه میکنه (یه عکس از خروجی براتون میفرستم)

حاصلضرب دو عدد 123456789 و 987654321 رو نشون میده

لینک عکس:

untitled_rh73.png

ممنون میشم راهنماییم بفرمایین

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

مشکلی نداره و کد مربوط به بخش نمایش مقادیر رو ببینم.

نقل قول

خروجی در سیستم من: 121932631112635269

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
ارسال شده در (ویرایش شده)

این کدهایی هست که من نوشتم (فایلی به اسم calculator.cpp)

"calculator.h"
#include "ui_calculator.h"
#include "BigInt.hpp"

 
calculator::calculator(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::calculator)
{
    ui->setupUi(this);

 

 
    action=Action_Type::nothing;

 
    connect(ui->Button_0,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"0");});
    connect(ui->Button_1,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"1");});
    connect(ui->Button_2,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"2");});
    connect(ui->Button_3,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"3");});
    connect(ui->Button_4,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"4");});
    connect(ui->Button_5,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"5");});
    connect(ui->Button_6,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"6");});
    connect(ui->Button_7,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"7");});
    connect(ui->Button_8,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"8");});
    connect(ui->Button_9,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+"9");});
    connect(ui->Button_dot,&QPushButton::clicked,this,[this](){ui->display->setText(ui->display->text()+".");});

 
    connect(ui->Button_add,SIGNAL(clicked(bool)),this,SLOT(onAdd()));
    connect(ui->Button_div,SIGNAL(clicked(bool)),this,SLOT(onDiv()));
    connect(ui->Button_sub,SIGNAL(clicked(bool)),this,SLOT(onSub()));
    connect(ui->Button_mul,SIGNAL(clicked(bool)),this,SLOT(onMul()));
    connect(ui->Button_result,SIGNAL(clicked(bool)),this,SLOT(onResult()));
    connect(ui->Button_clean,SIGNAL(clicked(bool)),this,SLOT(onClean()));
    connect(ui->Button_exit,SIGNAL(clicked(bool)),this,SLOT(onExit()));

 

 
}

 
calculator::~calculator()
{
    delete ui;
}

 
void calculator::onAdd()
{
    if(ui->display->text().isEmpty())
    return;
    previousVal=ui->display->text().toDouble();
    action=Action_Type::add;
    ui->resultdisplay->setText(ui->display->text()+"+");
    ui->display->clear();
}
void calculator::onSub()
{
    if(ui->display->text().isEmpty())
    return;
    previousVal=ui->display->text().toDouble();
    action=Action_Type::sub;
    ui->resultdisplay->setText(ui->display->text()+"-");
    ui->display->clear();
}
void calculator::onMul()
{
    if(ui->display->text().isEmpty())
    return;
    previousVal=ui->display->text().toDouble();
    action=Action_Type::mul;
    ui->resultdisplay->setText(ui->display->text()+"*");
    ui->display->clear();
}
void calculator::onDiv()
{
    if(ui->display->text().isEmpty())
    return;
    previousVal=ui->display->text().toDouble();
    action=Action_Type::div;
    ui->resultdisplay->setText(ui->display->text()+"/");
    ui->display->clear();
}

 
void calculator::onResult()
{
    if(ui->display->text().isEmpty())
    return;

 
    double currentVal=ui->display->text().toDouble();
    if(action!=Action_Type::nothing)
    {
        switch (action) {
        case Action_Type::add:
            ui->resultdisplay->setText(ui->resultdisplay->text()+QString::number(currentVal)+"="+QString::number(previousVal + currentVal));
            break;
        case Action_Type::sub:
            ui->resultdisplay->setText(ui->resultdisplay->text()+QString::number(currentVal)+"="+QString::number(previousVal - currentVal));
            break;
        case Action_Type::mul:
            ui->resultdisplay->setText(ui->resultdisplay->text()+QString::number(currentVal)+"="+QString::number(previousVal * currentVal));
            break;
        case Action_Type::div:
            ui->resultdisplay->setText(ui->resultdisplay->text()+QString::number(currentVal)+"="+QString::number(previousVal / currentVal));
            break;
        default:
            break;
        }
        ui->display->clear();
        action=Action_Type::nothing;
    }
}
void calculator::onClean()
{
    if(ui->display->text().isEmpty())
    return;
    previousVal=ui->display->text().toDouble();
    action=Action_Type::clean;
   // ui->resultdisplay->setText(ui->display->text()+"");
    ui->display->clear();
}

 
void calculator::onExit()
{
    calculator::close();

بنظرتون مشکل از کجاست

ویرایش شده در توسط کامبیز اسدزاده
عدم بلاک‌گذاری کد.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

به نظرم به خاطر تبدیل مجدد به double هست، خب شما خروجی مستقیم از کتابخانه رو چاپ کنید و در قالب Text به کنترل QLabel بدین.

یک مثال ساده:

BigInt big1 = 123456789;
BigInt big2 = 987654321;
BigInt res = big1 * big2;
qDebug() << res.to_string().c_str();
ui->label->setText(res.to_string().c_str());

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

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

به هر حال ممنون از شما که برام وقت گذاشتین

سپاسگزارم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 9 ساعت قبل، rezaict گفته است :

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

به هر حال ممنون از شما که برام وقت گذاشتین

سپاسگزارم

درود، کدی که مثال زدم رو سعی کنید خیلی ساده جایگزین کنید، کار خاصی نداره؛ نباید در خروجی نهایی نوع دابل اعمال بشه و سعی کنید در قالب خودش یعنی رشته نمایشش بدین.

موفق باشید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
ارسال شده در (ویرایش شده)

سلام مجدد، بالاخره تونستم با راهنمایی شما مشکل رو حل کنم البته کدها رو به این شکل تغییر دادم (به عنوان مثال برای عمل جمع) 

BigInt result;
result = previousVal + currentVal;
ui->resultdisplay->setText(result.to_string().c_str());
و دستور زیر رو حذف کردم:

//ui->resultdisplay->setText(ui->resultdisplay->text()+QString::number(currentVal)+"="+QString::number(previousVal + currentVal));

 

سپاس از شما

ویرایش شده در توسط کامبیز اسدزاده
عدم بلاک‌گذاری کد.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو ملحق شوید

شما همین الآن می‌توانید مطلبی را ارسال و بعداً ثبت‌نام کنید. اگر حساب کاربری دارید، و با حساب کاربری خود مطلب ارسال کنید.
نکته: مطلب شما قبل از انتشار نیاز به بازبینی توسط میانجی‌گر‌ها دارد.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...