الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

convert from decimal with fraction to binary

بدأه ريحانة الاقصى في 17 سبتمبر 2012 · 2 رد · 1,029 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

عملت على تحوبل من عشري الى ثنائي ولكن كيف اجعله بتعامل مع الكسور ايضا ؟؟

#include <iostream>
using namespace std;
int main()
{
	long dec,rem,i=1,sum=0;
	cout<<"Enter the decimal to be converted:";
	cin>>dec;
	do
	{
		rem=dec%2;
		sum=sum + (i*rem);
		dec=dec/2;
		i=i*10;
	}while(dec>0);
	cout<<"The binary of the given number is:"<<sum<<endl;
	cin.get();
	cin.get();
	return 0;
}
#2

السلام عليكم

بداية, تمثيل الأعداد الحقيقية يتغير بتغير النظام الذي تعملين عليه (16 bits, 32 bits, 64 bits) و أيضا بتغير المعيار المُستخدم (IEEE مثلا).

أيضا, الأعداد الحقيقية (أو الأعداد ذات الفاصلة العائمة) نادراً ما يكون لديها قيمة مُكافئة في النظام الثنائي. النتيجة التي ستحصلين عليها بعد التحويل ستكون تقريبية بدرجة معينة (نقول أن حل أفضل من آخر إذا كانت دقة الفاصلة أكثر).

تحويل عدد حقيقي إلى النظام الثنائي, يرتكز على جزئين, الجزء الموجود قبل الفاصلة و الجزء الموجود بعدها.

يتم حساب العدد المكافئ للجزء الموجود يمين الفاصلة هكذا :

الرقم الأول : 2^0 = 1

الرقم الثاني : 2^1 = 2

الرقم الثالث : 2^2 = 4

و هكذا دواليك ..

أما الجزء الموجود يسار الفاصلة فيتم حسابه هكذا :

الرقم الأول : 2^(-1)=0,5

الرقم الثاني : 2^(-2)=0,25

الرقم الثالث : 2^(-3)=0,125

الرقم الرابع : 2^(-4)=0,0625

...

مثال : لنفرض أنك تريدين تحويل العدد 2.3 إلى النظام الثنائي, إذا النتائج ستكون كالآتي :

الناتج بتقريب 0,05 = 10,01

الناتج بتقريب 0,01875 = 10,01001

الناتج بتقريب 0,003125 = 10,010011

القيمة المُكافئة للتقريب الأخير هي :

10,010011 = 2^(1) + 2^(-2) + 2^(-5) + 2^(-6) = 2,296875

حاولي كتابة الخوارزمية بنفسك و إن لم تستطيعي .. سأساعدك في الوصول إلى الحل :)

#3

السلام عليكم

أنا و جدت فكرت السؤال جيدة فقمت بكتابة هذا البرنامج لتحويل إلى النظام الثنائي و هو يتعامل مع الأعداد العشرية

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

string  binary(int number)
{
	string str;
	int remainder;
	char buffer[33];
	if(number <= 1) {
	str = itoa(number, buffer, 10);
		return str;
	}
	while(number > 0)
	{
		remainder = number % 2;
		number = number / 2;
   			str += itoa(remainder, buffer, 10);
	}
	return str;
}
string d_binary(double number)
{
	string result;
	double intpart, frac_part = number;
	while(true)
	{
    	frac_part *=  2;
    	if(frac_part > 1 )
    	{
        	result += "1";
        	frac_part = modf(frac_part, &intpart);
    	}
    	else
    	{
        	result += "0";
    	}
    	if(result.length() == 50)
    	{
        	break;
    	}
	}
	return result;
}
string reverse(string str)
{
	char s = 0;
	string out;
	for(int i = str.length() ; i > 0; i--)
	{
         		out+= str[i - 1];
	}
	return out;
}
string decTobin(double number)
{
	double frac_part, intpart;
	frac_part = modf(number, &intpart);
	string result = reverse(binary((int)intpart));
	result += ".";
	result += d_binary(frac_part);
	return result;
}
int main(int argc, char ** argv)
{
	double in_number = 0.0;
	cout << "Entet the number : " << endl;
	cin >> in_number;
	cout << decTobin(in_number)<< endl;
	return 0;
}

مواضيع مشابهة