⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perfectonedlg.cpp

📁 这是一个将浮点数转换成IEEE浮点数的程序
💻 CPP
字号:
// perfectoneDlg.cpp : implementation file
//

#include "stdafx.h"
#include "perfectone.h"
#include "perfectoneDlg.h"

#include <stdio.h>
#include <iostream>
using namespace std;
#include <string.h>
#include <stdlib.h>
#include <math.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPerfectoneDlg dialog

CPerfectoneDlg::CPerfectoneDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPerfectoneDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPerfectoneDlg)
	m_NumString0 = _T("");
	m_NumString4 = _T("");
	m_NumString3 = _T("");
	m_NumString2 = _T("");
	m_NumString1 = _T("");
	m_Sign = _T("");
	m_Jie = _T("");
	m_OrderHead = _T("");
	m_HexOrder = _T("");
	m_BinOrder = _T("");
	m_Order = 0;
	m_Value = 0.0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPerfectoneDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPerfectoneDlg)
	DDX_Text(pDX, IDC_FIRST, m_NumString0);
	DDX_Text(pDX, IDC_FIFTH, m_NumString4);
	DDX_Text(pDX, IDC_FOUTH, m_NumString3);
	DDX_Text(pDX, IDC_THIRD, m_NumString2);
	DDX_Text(pDX, IDC_SECOND, m_NumString1);
	DDX_Text(pDX, IDC_SIGN, m_Sign);
	DDX_Text(pDX, IDC_JIE, m_Jie);
	DDX_Text(pDX, IDC_ORDERHEAD, m_OrderHead);
	DDX_Text(pDX, IDC_HEXORDER, m_HexOrder);
	DDX_Text(pDX, IDC_BINORDER, m_BinOrder);
	DDX_Text(pDX, IDC_ORDER, m_Order);
	DDX_Text(pDX, IDC_VALUE, m_Value);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPerfectoneDlg, CDialog)
	//{{AFX_MSG_MAP(CPerfectoneDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPerfectoneDlg message handlers

BOOL CPerfectoneDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CPerfectoneDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CPerfectoneDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CPerfectoneDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CPerfectoneDlg::OnOK() 
{
	// TODO: Add extra validation here
	UpdateData(true);
	//定义命令编码变量
	int Order=m_Order;
	InputValue=m_Value;
	char Order_String_Bin[9];


	if(Order>=0&&Order<=1999)//得到命令代码(没有模式代码)
	{
		itoa(Order, Order_String_Bin, 16);
		strcat(Order_String_Bin,"0000");
	}
	else
	{
		itoa(Order-1999, Order_String_Bin, 16);
		strcat(Order_String_Bin,"8000");
	}
	m_OrderHead=CPerfectoneDlg::MyFomartString(Order_String_Bin, 7);


	if(InputValue>=0)//得到符号位
	{
		m_Sign="0";
	}
	else
	{
		m_Sign="1";
	}


	//定义数值计算变量
    
	int LengthofInputValue;//阶数
	double EndNum;  //尾数
	double PEndNum; //百分比尾数
	int NumString[5];//保存尾数的5位
	char LengthofInputValueBin[9];    

    LengthofInputValue=floor(log(InputValue) / log(2));//得到阶数   
    CString aa=MyIntToString(LengthofInputValue);
	AfxMessageBox(aa);

	itoa(LengthofInputValue+127,LengthofInputValueBin,2);//得到输入值二进制形式
		
	
    m_Jie=CPerfectoneDlg::MyFomartString(LengthofInputValueBin, 8);//模式化阶
	
    EndNum=InputValue-(double)pow(2,LengthofInputValue);//得到尾数

	PEndNum=EndNum/pow(2,LengthofInputValue);//尾数百分比
    //得到尾数的五位
    NumString[0]=PEndNum*16;		
	NumString[1]=(PEndNum*16-NumString[0])*16;
	NumString[2]=((PEndNum*16-NumString[0])*16-NumString[1])*16;
	NumString[3]=(((PEndNum*16-NumString[0])*16-NumString[1])*16-NumString[2])*16;
	NumString[4]=((((PEndNum*16-NumString[0])*16-NumString[1])*16-NumString[2])*16-NumString[3])*16;  
	
	//得到尾数的五位二进制形式
	m_NumString0=CPerfectoneDlg::MakeEndBin(NumString[0]);
    m_NumString1=CPerfectoneDlg::MakeEndBin(NumString[1]);
    m_NumString2=CPerfectoneDlg::MakeEndBin(NumString[2]);
	m_NumString3=CPerfectoneDlg::MakeEndBin(NumString[3]);
	m_NumString4=CPerfectoneDlg::MakeEndBin(NumString[4]);

    //输入数值的IEEE二进制形式
	m_BinOrder=m_Sign+m_Jie+m_NumString0+m_NumString1+m_NumString2+m_NumString3+m_NumString4+"000";
    char * IEEEBin=m_BinOrder.GetBuffer(0);
    char IEEEHex[8][5];//十六进制的IEEE数
	for(int i=0;i<8;i++)
	{
		char temp_string[5]="";
		int temp_int=0;
		for(int j=0;j<4;j++)
		{
		    int temp_bit=0;
			char temp_char[2]="";
			temp_char[0]=IEEEBin[4*i+j];
			temp_bit=atoi(temp_char);            
			temp_int=temp_int+temp_bit*pow(2,(3-j));
		}		
        
		itoa(temp_int,IEEEHex[i], 16);
	    
	}
	char  FinalHex[9]="";//最后的十六进制数
	strcat(FinalHex,m_OrderHead);
    for(int i_f=0;i_f<8;i_f++)
	{
		strcat(FinalHex,IEEEHex[i_f]);
	}
	m_HexOrder=FinalHex;

	//CDialog::OnOK();
	UpdateData(false);
}

char * CPerfectoneDlg::MakeEndBin(int x)//模式化0到15之间的数
{
int num=x;
	char * numstring;
	switch(num)
	{
	case 0:
		numstring="0000";
		break;
	case 1:
		numstring="0001";
		break;
	case 2:
		numstring="0010";
		break;
	case 3:
		numstring="0011";
		break;
	case 4:
		numstring="0100";
		break;
	case 5:
		numstring="0101";
		break;
	case 6:
		numstring="0110";
		break;
	case 7:
		numstring="0111";
		break;
	case 8:
		numstring="1000";
		break;
	case 9:
		numstring="1001";
		break;
	case 10:
		numstring="1010";
		break;
	case 11:
		numstring="1011";
		break;
	case 12:
		numstring="1100";
		break;
	case 13:
		numstring="1101";
		break;
	case 14:
		numstring="1110";
		break;
	case 15:
		numstring="1111";
		break;
	default:
		AfxMessageBox("数值不在0到15之间!");
		numstring="errr";

	}
	return numstring;

}

CString CPerfectoneDlg::MyFomartString(char *str, int length)//模式化字符串
{
	CString cstr;
	cstr.Format("%s",str);
	int len=cstr.GetLength();
	if(len<length)
	{
		for(int i=0;i<length-len;i++)
		{
			cstr.Insert(0,'0');
		}
	}
	return cstr;
}



CString CPerfectoneDlg::MyIntToString(int x)//整型到CString型转换
{
	CString cstr;
	//char * str=new char[];	
	//itoa(x, str, 10);
	cstr.Format("%d",x);
	//delete []str;
	return cstr;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -